node ng2 form example data javascript angularjs node.js express multer

javascript - ng2 - Multer no acepta archivos en formato de matriz da ''Error de archivo inesperado''



node js express post multipart form data (2)

La razón del error es que multer actualmente no es compatible con la sintaxis de matriz que utiliza ng-file-upload de forma predeterminada, que son files[0] , files[1] , files[2] , etc. multer espera una serie de archivos con el mismo nombre de campo

La solución más fácil es establecer la opción arrayKey ng-file-upload como para evitar agregar la parte [index] :

Upload.upload({ url: ''/api/data/addtweet'', arrayKey: '''', // default is ''[i]'' data: { files: files } })

Multer es un módulo utilizado junto con el nodo js y express para cargar archivos. Estoy usando el módulo de carga ng-file en el lado angular.

Cuando envío múltiples archivos uno por uno funciona bien sin ningún tipo de error, pero cuando envío todos los archivos de una sola vez en formato de matriz y luego hago los cambios necesarios en el lado del servidor como sugiere el github de Multer, sigue apareciendo un error .

Aquí está el error

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)

Código de controlador de muestra

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)); }); } }; }]);

Por favor dime que estoy haciendo mal. Las búsquedas de Google no fueron tan útiles, ya lo he intentado con la publicación que estoy publicando aquí.


Si alguien se enfrenta a un problema similar al cargar un objeto de datos de formulario personalizado, puede utilizar este enfoque. Aquí no estoy usando ngFileUpload.

Código de cliente

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 } });

Enrutador Express

var multer = require("multer"); var upload = multer({ dest: "uploads/" }); app.post(''/api/uploadFiles'', upload.array(''fileItems''), handlers.files.uploadFiles);