Мультер, не принимающий файлы в формате массива, дает "непредвиденную ошибку файла"
Multer-это модуль, используемый вместе с узлом js и express для загрузки файлов. Я использую модуль загрузки ng-файла на угловой стороне.
когда я отправляю несколько файлов один за другим, он работает просто отлично без каких-либо ошибок, но когда я отправляю все файлы за один раз в формате массива, а затем я делаю необходимые изменения на стороне сервера, как предложено GitHub Мультера, все равно ошибка приходит.
вот ошибка
Error: Unexpected field
at makeError (C:nodefilesnewnode_modulesmulterlibmake-error.js:12:13)
at wrappedFileFilter (C:nodefilesnewnode_modulesmulterindex.js:39:19)
at Busboy.<anonymous> (C:nodefilesnewnode_modulesmulterlibmake-middleware.js:109:7)
at Busboy.emit (events.js:118:17)
at Busboy.emit (C:nodefilesnewnode_modulesmulternode_modulesbusboylibmain.js:31:35)
at PartStream.<anonymous> (C:nodefilesnewnode_modulesmulternode_modulesbusboylibtypesmultipart.js:209:13)
at PartStream.emit (events.js:107:17)
at HeaderParser.<anonymous> (C:nodefilesnewnode_modulesmulternode_modulesbusboynode_modulesdicerlibDicer.js:51:16)
at HeaderParser.emit (events.js:107:17)
at HeaderParser._finish (C:nodefilesnewnode_modulesmulternode_modulesbusboynode_modulesdicerlibHeaderParser.js:70:8)
at SBMH.<anonymous> (C:nodefilesnewnode_modulesmulternode_modulesbusboynode_modulesdicerlibHeaderParser.js:42:12)
at SBMH.emit (events.js:118:17)
at SBMH._sbmh_feed (C:nodefilesnewnode_modulesmulternode_modulesbusboynode_modulesdicernode_modulesstreamsearchlibsbmh.js:159:14)
at SBMH.push (C:nodefilesnewnode_modulesmulternode_modulesbusboynode_modulesdicernode_modulesstreamsearchlibsbmh.js:56:14)
at HeaderParser.push (C:nodefilesnewnode_modulesmulternode_modulesbusboynode_modulesdicerlibHeaderParser.js:48:19)
at Dicer._oninfo (C:nodefilesnewnode_modulesmulternode_modulesbusboynode_modulesdicerlibDicer.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 не были, что полезно, я уже пробовал, что я.е.почему я отправляю здесь.
2 ответов
причина ошибки в том, что multer
в настоящее время не поддерживает синтаксис массива ng-file-upload
использует по умолчанию, которая составляет files[0]
, files[1]
, files[2]
, etc. multer
ожидает файлы с то же имя поля.
самое простое решение-установить ng-file-upload
' s как так, чтобы избежать добавления [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);