UNPKG

@lskjs/upload

Version:
239 lines (237 loc) 9.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.UploadServerModule = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _err = _interopRequireDefault(require("@lskjs/err")); var _module = _interopRequireDefault(require("@lskjs/module")); var _fs = _interopRequireDefault(require("fs")); var _random = _interopRequireDefault(require("lodash/random")); var _multer = _interopRequireDefault(require("multer")); var _path = _interopRequireDefault(require("path")); var _mimetypes = require("./mimetypes"); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var UploadServerModule = /*#__PURE__*/function (_Module) { (0, _inherits2["default"])(UploadServerModule, _Module); var _super = _createSuper(UploadServerModule); function UploadServerModule() { var _this; (0, _classCallCheck2["default"])(this, UploadServerModule); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); _this.mimetypes = _mimetypes.mimetypes; return _this; } (0, _createClass2["default"])(UploadServerModule, [{ key: "init", value: function () { var _init = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.next = 2; return (0, _get2["default"])((0, _getPrototypeOf2["default"])(UploadServerModule.prototype), "init", this).call(this); case 2: if (this.config.mimetypes) this.mimetypes = this.config.mimetypes; this.initStorage(); this.multer = this.getMulter(); case 5: case "end": return _context.stop(); } }, _callee, this); })); function init() { return _init.apply(this, arguments); } return init; }() }, { key: "validateMIMEType", value: function validateMIMEType(mimetype, cb) { if (Array.isArray(this.mimetypes)) { if (this.mimetypes.indexOf(mimetype) === -1) { cb(new _err["default"]('upload.invalidMimetype', 'Uploading files with this MIME-type is prohibited', { status: 415 }), mimetype); return false; } } return true; } }, { key: "getMulter", value: function getMulter() { var _this2 = this; this.log.trace('set mimetypes', this.mimetypes); var fileFilter = function fileFilter(req, file, cb) { var isMIMETypeValid = _this2.validateMIMEType(file.mimetype, cb); if (!isMIMETypeValid) return; cb(null, true); }; var limits = {}; var maxSize = this.config.maxSize || this.config.local && this.config.local.maxSize; if (maxSize) { var fileSize = parseFloat(maxSize) * 1024 * 1024; this.log.trace('set maxSize', maxSize); limits.fileSize = fileSize; } return (0, _multer["default"])({ storage: this.storage, limits: limits, fileFilter: fileFilter }); } }, { key: "initStorage", value: function initStorage() { this.storage = this.getStorage(); } }, { key: "getFileInfo", value: function getFileInfo(file) { if (this.config.s3) { return { name: file.fieldname, url: file.location, path: file.location, relative: "/".concat(file.key), mimetype: file.mimetype, filename: file.originalname, info: { size: file.size, bucket: file.bucket, acl: file.acl, etag: file.etag } }; } return { name: file.fieldname, url: this.app.url("/".concat(file.path)), path: "/".concat(file.path), relative: "/".concat(file.path), mimetype: file.mimetype, filename: file.originalname }; } }, { key: "getFileExt", value: function getFileExt(file) { if (file && file.mimetype && _mimetypes.mimetypes[file.mimetype]) { return _mimetypes.mimetypes[file.mimetype]; } if (file && file.originalname) { var res = file.originalname.match(/\.([0-9a-z]+)(?:[\?#]|$)/i); //eslint-disable-line if (res && res[1]) { return res[1]; } } return null; } // @TODO real file name // const getFileName = (file) => { // return file.originalname; // }; }, { key: "createDir", value: function createDir(targetDir) { if (!_fs["default"].existsSync(targetDir)) { targetDir.split('/').forEach(function (dir, index, splits) { var parent = splits.slice(0, index).join('/'); var dirPath = _path["default"].resolve(parent, dir); if (!_fs["default"].existsSync(dirPath)) { _fs["default"].mkdirSync(dirPath); } }); } } }, { key: "getFilePath", value: function getFilePath(req, file) { var config = this.config; var _config$path = config.path, path = _config$path === void 0 ? 'storage' : _config$path; if (req.user && req.user._id) { path += "/".concat(req.user._id); } else if (config.allowGuest) { path += '/guests'; } else { this.app.log.error('Guest can not upload files'); throw new _err["default"]('Guest can not upload files', { status: 403 }); } var fileName; if (config.allowSetFilename && file.originalname !== 'blob') { fileName = file.originalname; } else { fileName = "".concat(Date.now(), "_").concat((0, _random["default"])(0, 1000)); var ext = this.getFileExt(file); if (ext) { fileName = "".concat(fileName, ".").concat(ext); } } var _config$prefix = config.prefix, prefix = _config$prefix === void 0 ? '' : _config$prefix; var filePath = "".concat(path, "/").concat(prefix).concat(fileName); // console.log({ filePath }); return filePath; } }, { key: "getStorage", value: function getStorage() { var _this3 = this; // const config = this.app.config.upload; var storage = _multer["default"].diskStorage({ destination: function destination(req, file, cb) { // console.log('destination'); var path; var dirname; try { path = _this3.getFilePath(req, file); dirname = path.split('/').slice(0, -1).join('/'); _this3.createDir(dirname); } catch (err) { return cb(err); } return cb(null, dirname); }, filename: function filename(req, file, cb) { var path; var filename; try { path = _this3.getFilePath(req, file); var _path$split$reverse = path.split('/').reverse(); var _path$split$reverse2 = (0, _slicedToArray2["default"])(_path$split$reverse, 1); filename = _path$split$reverse2[0]; } catch (err) { return cb(err); } // console.log('filename', filename); // this.createDir(filename); return cb(null, filename); } }); return storage; } }]); return UploadServerModule; }(_module["default"]); exports.UploadServerModule = UploadServerModule; var _default = UploadServerModule; exports["default"] = _default; //# sourceMappingURL=UploadServerModule.js.map