@lskjs/upload
Version:
LSK module for uploading files.
239 lines (237 loc) • 9.4 kB
JavaScript
"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