will-core
Version:
core module
100 lines (99 loc) • 4.04 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UploadRouter = void 0;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const multer_1 = __importDefault(require("multer"));
const uuid_1 = require("uuid");
const will_api_1 = require("will-api");
const Responser_1 = require("../utils/Responser");
;
const EnvironmentVariable_1 = require("../utils/EnvironmentVariable");
const AttachHandler_1 = require("../handlers/AttachHandler");
const BaseRouter_1 = require("./BaseRouter");
const buddystorage = multer_1.default.diskStorage({
destination: function (req, file, cb) {
let dir = path_1.default.join(EnvironmentVariable_1.UPLOAD_RESOURCES_PATH, "uploaded", "files");
if (!fs_1.default.existsSync(dir)) {
fs_1.default.mkdirSync(dir, { recursive: true });
}
cb(null, dir);
},
filename: function (req, file, cb) {
let extension = path_1.default.extname(file.originalname);
let fileid = (0, uuid_1.v4)();
let filename = fileid + extension;
req.params.fileid = fileid;
cb(null, filename.toLowerCase());
}
});
class UploadRouter extends BaseRouter_1.BaseRouter {
constructor(service, dir, paramname = "filename", fileTypes, fileSize) {
super(service, dir);
this.fileuploader = this.buildMulter(fileTypes, fileSize);
this.uploadfile = this.fileuploader.single(paramname);
}
buildMulter(fileTypes = /jpeg|jpg|png|pdf/, fileSize = 10 * 1024 * 1024) {
return (0, multer_1.default)({
storage: buddystorage,
limits: { fileSize: fileSize },
fileFilter: function (req, file, cb) {
console.log("fileFilter:", file);
const filetypes = fileTypes;
const extname = filetypes.test(path_1.default.extname(file.originalname).toLowerCase());
const mimetype = filetypes.test(file.mimetype);
if (mimetype && extname) {
cb(null, true);
}
else {
cb(new Error("Invalid file type"));
}
}
});
}
doUpload(req, res) {
this.uploadfile(req, res, (err) => {
if (err) {
Responser_1.Responser.responseError(res, err, "upload", "file");
return;
}
this.doUploadFile(req, res);
});
}
async doUploadFile(req, res) {
res.contentType('application/json');
console.log(this.constructor.name + ".doUploadFile: body", JSON.stringify(req.body));
console.log(this.constructor.name + ".doUploadFile: file", req.file);
let response = new will_api_1.JSONReply();
response.head.modeling("upload", "file");
response.head.composeNoError();
try {
let ctx = await this.createContext(req);
ctx.params.file = req.file;
let handler = new AttachHandler_1.AttachHandler();
let rs = await handler.attach(ctx);
response.body = rs;
res.end(JSON.stringify(response));
}
catch (ex) {
Responser_1.Responser.responseError(res, ex, "upload", "file");
}
}
}
exports.UploadRouter = UploadRouter;
//ex. curl -X POST http://localhost:8080/upload/file -F filename=@D:\images\birth.png -F type=IMG
/*
file {
fieldname: 'filename',
originalname: 'birth.png',
encoding: '7bit',
mimetype: 'image/png',
destination: 'C:\\Users\\ADMIN\\AppData\\Local\\Temp\\uploaded\\files',
filename: 'f51aa9e2-385b-4ae2-b024-2b65f1a5250b.png',
path: 'C:\\Users\\ADMIN\\AppData\\Local\\Temp\\uploaded\\files\\f51aa9e2-385b-4ae2-b024-2b65f1a5250b.png',
size: 10717
}
*/