UNPKG

thinknode

Version:

A fast, flexible and all-in-one web framework for node.js.

149 lines (115 loc) 4.67 kB
'use strict'; exports.__esModule = true; var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _crypto = require('crypto'); var _crypto2 = _interopRequireDefault(_crypto); var _multiparty = require('multiparty'); var _multiparty2 = _interopRequireDefault(_multiparty); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * 上传文件解析中间件 * @author richen * @copyright Copyright (c) 2015 - <richenlin(at)gmail.com> * @license MIT * @version 15/11/19 */ var MULTIPARTY_REG = /^multipart\/(form-data|related);\s*boundary=(?:"([^"]+)"|([^;]+))$/i; var _class = function (_THINK$Middleware) { (0, _inherits3.default)(_class, _THINK$Middleware); function _class() { (0, _classCallCheck3.default)(this, _class); return (0, _possibleConstructorReturn3.default)(this, _THINK$Middleware.apply(this, arguments)); } _class.prototype.run = function run(data) { if (!this.http.req.readable) { return _promise2.default.resolve(); } //file upload by form or FormData //can not use http.type method if (MULTIPARTY_REG.test(this.http.headers['content-type'])) { return this.postFile(); } else if (this.http.req.headers[THINK.config('post_ajax_filename_header')]) { return this.ajaxFile(); } return _promise2.default.resolve(data); }; _class.prototype.postFile = function postFile() { var _this2 = this; //make upload file path var uploadDir = THINK.config('post_file_temp_path'); if (!THINK.isDir(uploadDir)) { THINK.mkDir(uploadDir); } var deferred = THINK.getDefer(); var form = new _multiparty2.default.Form({ maxFieldsSize: THINK.config('post_max_fields_size'), maxFields: THINK.config('post_max_fields'), maxFilesSize: THINK.config('post_max_file_size'), uploadDir: uploadDir }); //support for file with multiple="multiple" var files = this.http._file; form.on('file', function (name, value) { if (name in files) { if (!THINK.isArray(files[name])) { files[name] = [files[name]]; } files[name].push(value); } else { files[name] = value; } }); form.on('field', function (name, value) { _this2.http._post[name] = value; }); //有错误后直接拒绝当前请求 form.on('error', function (err) { return deferred.reject(err); }); form.on('close', function () { deferred.resolve(); }); form.parse(this.http.req); return deferred.promise; }; _class.prototype.ajaxFile = function ajaxFile() { var _this3 = this; var filename = this.http.header(THINK.config('post_ajax_filename_header')); var name = _crypto2.default.randomBytes(20).toString('base64').replace(/\+/g, '_').replace(/\//g, '_'); //make upload file path var filepath = THINK.config('post_file_temp_path'); if (!THINK.isDir(filepath)) { THINK.mkDir(filepath); } filepath += '/' + name + _path2.default.extname(filename).slice(0, 5); var deferred = THINK.getDefer(); var stream = _fs2.default.createWriteStream(filepath); this.http.req.pipe(stream); stream.on('error', function (err) { return deferred.reject(err); }); stream.on('close', function () { _this3.http._file = { fieldName: 'file', originalFilename: filename, path: filepath, size: _fs2.default.statSync(filepath).size }; deferred.resolve(); }); return deferred.promise; }; return _class; }(THINK.Middleware); exports.default = _class;