Multer不接受数组格式的文件会导致“Unexpected File Error”
Multer是一个与节点js一起使用的模块,用于上传文件。 我正在使用ngfile upload模块的angular度。
当我一个接一个地发送多个文件时,它工作的很好,没有任何错误,但是当我以数组格式一次性发送所有文件,然后根据Multer的github的build议在服务器端进行必要的更改时,仍然出现错误。
这是错误
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)); }); } }; }]);
请告诉我我做错了什么。 谷歌search没有那么有用,我已经试过,因为我在这里发布。
错误的原因是, multer
目前不支持ng-file-upload
默认使用的数组语法,即files[0]
, files[1]
, files[2]
等multer
期望一系列文件具有相同的字段名称 。
最简单的解决scheme是像这样设置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 } });
快速路由器
var multer = require("multer"); var upload = multer({ dest: "uploads/" }); app.post('/api/uploadFiles', upload.array('fileItems'), handlers.files.uploadFiles);