Multer 不接受数组格式的文件给出 'Unexpected File Error'
Multer not accepting files in array format gives 'Unexpected File Error'
Multer是配合node js和express一起使用的上传文件的模块。我在 angular 端使用 ng-file 上传模块。
当我一个一个地发送多个文件时,它工作得很好,没有任何错误,但是当我以数组格式一次性发送所有文件,然后我按照 Multer 的建议在服务器端进行必要的更改时github,还是报错。
这里是错误
Error: Unexpected field
at makeError (C:\nodefiles\new\node_modules\multer\lib\make-error.js:12:13)
at wrappedFileFilter (C:\nodefiles\new\node_modules\multer\index.js:39:19)
at Busboy.<anonymous> (C:\nodefiles\new\node_modules\multer\lib\make-middleware.js:109:7)
at Busboy.emit (events.js:118:17)
at Busboy.emit (C:\nodefiles\new\node_modules\multer\node_modules\busboy\lib\main.js:31:35)
at PartStream.<anonymous> (C:\nodefiles\new\node_modules\multer\node_modules\busboy\lib\types\multipart.js:209:13)
at PartStream.emit (events.js:107:17)
at HeaderParser.<anonymous> (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\Dicer.js:51:16)
at HeaderParser.emit (events.js:107:17)
at HeaderParser._finish (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:70:8)
at SBMH.<anonymous> (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:42:12)
at SBMH.emit (events.js:118:17)
at SBMH._sbmh_feed (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\node_modules\streamsearch\lib\sbmh.js:159:14)
at SBMH.push (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\node_modules\streamsearch\lib\sbmh.js:56:14)
at HeaderParser.push (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:48:19)
at Dicer._oninfo (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\Dicer.js:198:25)
示例控制器代码
var app = angular.module('fileUpload', ['ngFileUpload']);
app.controller('MyCtrl', ['$scope', 'Upload', '$timeout', function ($scope, Upload, $timeout) {
$scope.uploadFiles = function (files) {
$scope.files = files;
if (files && files.length) {
console.log(files);
Upload.upload({
url: '/api/data/addtweet',
data: {
files: files
}
}).then(function (response) {
$timeout(function () {
$scope.result = response.data;
});
}, function (response) {
if (response.status > 0) {
$scope.errorMsg = response.status + ': ' + response.data;
}
}, function (evt) {
$scope.progress =
Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
};
}]);
请告诉我我做错了什么。
Google 搜索不是很有用,我已经尝试过 i.e.why 我在这里发帖。
错误原因是multer
目前不支持ng-file-upload
默认使用的数组语法,即files[0]
、files[1]
、files[2]
,等等。multer
需要一系列具有 相同字段名称 的文件。
最简单的解决方案是像这样设置 ng-file-upload
的 arrayKey
选项以避免附加 [index]
部分:
Upload.upload({
url: '/api/data/addtweet',
arrayKey: '', // default is '[i]'
data: {
files: files
}
})
如果有人在上传自定义表单数据对象时遇到类似问题,您可以使用这种方法。在这里我没有使用 ngFileUpload。
客户端代码
var fd = new FormData();
for( var i =0; i< files.length ; i++ ){
fd.append('fileItems' , files[i] );
}
fd.append('_id', params._id );
fd.append('user', params.user );
return $http.post( ROOT_URL + '/uploadFiles/', fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined }
});
Express 路由器
var multer = require("multer");
var upload = multer({ dest: "uploads/" });
app.post('/api/uploadFiles', upload.array('fileItems'), handlers.files.uploadFiles);
Multer是配合node js和express一起使用的上传文件的模块。我在 angular 端使用 ng-file 上传模块。
当我一个一个地发送多个文件时,它工作得很好,没有任何错误,但是当我以数组格式一次性发送所有文件,然后我按照 Multer 的建议在服务器端进行必要的更改时github,还是报错。
这里是错误
Error: Unexpected field
at makeError (C:\nodefiles\new\node_modules\multer\lib\make-error.js:12:13)
at wrappedFileFilter (C:\nodefiles\new\node_modules\multer\index.js:39:19)
at Busboy.<anonymous> (C:\nodefiles\new\node_modules\multer\lib\make-middleware.js:109:7)
at Busboy.emit (events.js:118:17)
at Busboy.emit (C:\nodefiles\new\node_modules\multer\node_modules\busboy\lib\main.js:31:35)
at PartStream.<anonymous> (C:\nodefiles\new\node_modules\multer\node_modules\busboy\lib\types\multipart.js:209:13)
at PartStream.emit (events.js:107:17)
at HeaderParser.<anonymous> (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\Dicer.js:51:16)
at HeaderParser.emit (events.js:107:17)
at HeaderParser._finish (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:70:8)
at SBMH.<anonymous> (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:42:12)
at SBMH.emit (events.js:118:17)
at SBMH._sbmh_feed (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\node_modules\streamsearch\lib\sbmh.js:159:14)
at SBMH.push (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\node_modules\streamsearch\lib\sbmh.js:56:14)
at HeaderParser.push (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:48:19)
at Dicer._oninfo (C:\nodefiles\new\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\Dicer.js:198:25)
示例控制器代码
var app = angular.module('fileUpload', ['ngFileUpload']);
app.controller('MyCtrl', ['$scope', 'Upload', '$timeout', function ($scope, Upload, $timeout) {
$scope.uploadFiles = function (files) {
$scope.files = files;
if (files && files.length) {
console.log(files);
Upload.upload({
url: '/api/data/addtweet',
data: {
files: files
}
}).then(function (response) {
$timeout(function () {
$scope.result = response.data;
});
}, function (response) {
if (response.status > 0) {
$scope.errorMsg = response.status + ': ' + response.data;
}
}, function (evt) {
$scope.progress =
Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
};
}]);
请告诉我我做错了什么。 Google 搜索不是很有用,我已经尝试过 i.e.why 我在这里发帖。
错误原因是multer
目前不支持ng-file-upload
默认使用的数组语法,即files[0]
、files[1]
、files[2]
,等等。multer
需要一系列具有 相同字段名称 的文件。
最简单的解决方案是像这样设置 ng-file-upload
的 arrayKey
选项以避免附加 [index]
部分:
Upload.upload({
url: '/api/data/addtweet',
arrayKey: '', // default is '[i]'
data: {
files: files
}
})
如果有人在上传自定义表单数据对象时遇到类似问题,您可以使用这种方法。在这里我没有使用 ngFileUpload。
客户端代码
var fd = new FormData();
for( var i =0; i< files.length ; i++ ){
fd.append('fileItems' , files[i] );
}
fd.append('_id', params._id );
fd.append('user', params.user );
return $http.post( ROOT_URL + '/uploadFiles/', fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined }
});
Express 路由器
var multer = require("multer");
var upload = multer({ dest: "uploads/" });
app.post('/api/uploadFiles', upload.array('fileItems'), handlers.files.uploadFiles);