Javascript NodeJS Multer:未应用配置
我有一个使用Multer用NodeJS编写的简单上传应用程序,效果很好。代码如下:Javascript NodeJS Multer:未应用配置,javascript,node.js,file-upload,upload,multer,Javascript,Node.js,File Upload,Upload,Multer,我有一个使用Multer用NodeJS编写的简单上传应用程序,效果很好。代码如下: var express = require('express'), bodyParser = require('body-parser'), qs = require('querystring'), multer = require('multer'), logger = require('morgan'); var config = require('./config'),
var express = require('express'),
bodyParser = require('body-parser'),
qs = require('querystring'),
multer = require('multer'),
logger = require('morgan');
var config = require('./config'),
oauth = require('./oauth');
function extractExtension(filename) {
return filename.split('.').pop();
}
function getRandom(min, max) {
return Math.floor(Math.random() * max) + min;
}
var app = express();
//app.use(cors());
// Add headers
app.use(function(req, res, next) {
// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');
// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
// Request headers you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,Authorization,content-type');
// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader('Access-Control-Allow-Credentials', true);
// Pass to next layer of middleware
next();
});
// Multer
var momentUpload = multer({
dest: './uploads/',
limits: {
fileSize: 256 * 1024 * 1024
},
rename: function(fieldname, filename) {
return Date.now() + '-' + getRandom(100000, 999999) + '.' + extractExtension(filename);
},
onFileUploadStart: function(file) {
console.log(file.originalname + ' is starting ...')
},
onFileUploadComplete: function(file) {
console.log(file.fieldname + ' uploaded to ' + file.path)
}
}).single('file');
app.set('port', 4000);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.post('/file/upload', [oauth.ensureAuthenticated, momentUpload, function(req, res) {
console.log(req.body); // form fields
console.log(req.file); // form files
res.status(204).end();
}]);
// Start the Server
app.listen(app.get('port'), function() {
console.log('Metadata store env: ' + config.METADATASTORE_ENV);
console.log('Express server listening on port ' + app.get('port'));
firebase.authenticate();
console.log('Connected to Firebase');
});
然而,问题是Multer的配置似乎根本不起作用。destPath工作,文件出现在我提供的文件夹中(./uploads/)。允许使用更大的文件大小(例如,400MB的文件,而选项中明确说明了256MB),并且回调函数不会一次启动。没有错误消息。知道我做错了什么吗?我在Google和官方页面上遵循了指南,但无法使其正常工作。首先,multer最近更改了其API,因此它不再接受
重命名
,onFileUploadStart
或onFileUploadComplete
我们可以在这里看一下API,让我们分析一下新的工作方式
注意:如果您尚未更新multer版本,我强烈建议您更新,因为旧版本可能存在安全漏洞
基本用法
Multer接受一个选项对象,其中最基本的是dest
属性,它告诉Multer在何处上载文件。万一你
省略options对象,文件将保留在内存中,并且永远不会删除
写入磁盘
默认情况下,Multer将重命名文件以避免命名
冲突。重命名功能可根据您的需要定制
需要。
options对象还接受fileFilter
(控制上载哪些文件的函数)和limits
(指定大小限制的对象)参数
因此,您的代码如下所示(仅涉及multer部分,并考虑到您希望使用所有不必使用的选项):
如果您想对文件的存储有更多的控制,可以使用存储引擎。您可以创建自己的,也可以简单地使用可用的
可用的是:diskStorage
将文件存储在磁盘上,或memoryStorage
将文件作为缓冲区
对象存储在内存中
因为您显然希望将文件存储在磁盘中,所以让我们来讨论diskStorage
有两个可用选项:目的地
和文件名
destination
用于确定上载的文件夹
应该存储文件。这也可以作为字符串给出(例如。
“/tmp/uploads”)。如果未给出目标,则操作系统的
使用临时文件的默认目录
注意:提供时,您负责创建目录
目的地作为一个函数。当传递字符串时,multer将
确保已为您创建目录
filename
用于确定文件夹中的文件名称。如果没有指定文件名,每个文件将被指定一个不包含任何文件扩展名的随机名称
因此,您的代码(仅涉及multer部分)如下所示:
// Multer
//Storage configuration
var storageOpts = multer.diskStorage({
destination: function (req, file, cb) {
//Choose a destination
var dest = './uploads/';
//If you want to ensure that the directory exists and
//if it doesn't, it is created you can use the fs module
//If you use the following line don't forget to require the fs module!!!
fs.ensureDirSync(dest);
cb(null, dest);
},
filename: function (req, file, cb) {
//here you can use what you want to specify the file name
//(fieldname, originalname, encoding, mimetype, size, destination, filename, etc)
cb(null, file.originalname);
}
});
var momentUpload = multer({
storage: storageOpts,
limits: {
fileSize: 256 * 1024 * 1024
},
fileFilter: function(req, file, cb) {
// The function should call `cb` with a boolean
// to indicate if the file should be accepted
// To reject this file pass `false`, like so:
cb(null, false)
// To accept the file pass `true`, like so:
cb(null, true)
// You can always pass an error if something goes wrong:
cb(new Error('I don\'t have a clue!'))
}
}).single('file');
希望有帮助!:)
// Multer
//Storage configuration
var storageOpts = multer.diskStorage({
destination: function (req, file, cb) {
//Choose a destination
var dest = './uploads/';
//If you want to ensure that the directory exists and
//if it doesn't, it is created you can use the fs module
//If you use the following line don't forget to require the fs module!!!
fs.ensureDirSync(dest);
cb(null, dest);
},
filename: function (req, file, cb) {
//here you can use what you want to specify the file name
//(fieldname, originalname, encoding, mimetype, size, destination, filename, etc)
cb(null, file.originalname);
}
});
var momentUpload = multer({
storage: storageOpts,
limits: {
fileSize: 256 * 1024 * 1024
},
fileFilter: function(req, file, cb) {
// The function should call `cb` with a boolean
// to indicate if the file should be accepted
// To reject this file pass `false`, like so:
cb(null, false)
// To accept the file pass `true`, like so:
cb(null, true)
// You can always pass an error if something goes wrong:
cb(new Error('I don\'t have a clue!'))
}
}).single('file');