2014-10-21 5 views
2

Я пытаюсь загрузить несколько файлов вместе с некоторыми данными формы, используя этот угловой пакет, https://github.com/danialfarid/angular-file-upload. Вот мой код:Загрузка нескольких файлов не работает

var files = ... // get the files (this is working, don't worry) 

return $upload.upload({ 
    url: '/some_resource', 
    type: 'POST', 
    headers: { 'Content-Type': 'multipart/form-data' }, 
    data: { myObj: JSON.stringify(myObj) }, 
    file: files 
}); 

Если есть только один файл в files, то он загружает правильно - но если есть несколько файлов, то ничего не будет загружен. В документации, он говорит:

Загрузить несколько файлов: только для HTML5 FormData браузеров (не IE8-9), если вы передаете массив файлов в файл опции будет загружать их все вместе в одном запросе.

Я не совсем уверен, что я делаю что-то неправильно или нет (я использую Chrome).

Мое следующее предположение, что проблема связана с бэкэнд (я использую Express.js). Так как запрос 'multipart/form-data', я бегу через multer (https://github.com/expressjs/multer), например так:

app.post('/some_resource', multer({ dest: '../tmpUploads' }), function(req, res) { 
    console.log(req.files); // <- prints {} when uploading multiple files 
}); 

Как я уже сказал, моя установка работает прекрасно, когда files содержит только один файл. Любая помощь будет принята с благодарностью!

+1

Во-первых, я хотел бы попробовать использовать то есть Fiddler, чтобы проверить, является ли проблема на клиенте или на сервере. Во-вторых, попробуйте добавить имена для файлов: 'fileName' или' fileFormDataName'. Я пробовал этот модуль, но поскольку я не мог отказаться от поддержки IE8/9, теперь я использую этот [jQuery плагин] (https://blueimp.github.io/jQuery-File-Upload/angularjs.html), и он отлично работает. –

+0

Добавление свойства 'fileFormDataName' полностью сработало! Благодаря! – Cody

+0

@ Коди, какой-нибудь шанс показать нам, как вы его работали? Я столкнулся с той же проблемой и попытался немного поиграть с 'fileFormDataName', но не очень эффективно до сих пор ... любая помощь, которую вы могли бы предоставить, была бы очень благодарна :) –

ответ

1

Вот как я получил эту работу.

var files = [...] // array of the file objects 
var fileNames = [...] 
// a name in [fileNames] shares the same index as the file it names in [files] 

return $upload.upload({ 
    url: '/some_resource', 
    type: 'POST', 
    headers: { 'Content-Type': 'multipart/form-data' }, 
    data: { myObj: JSON.stringify(myObj) }, 
    file: files, 
    fileFormDataName: fileNames 
}); 

Мой node.js бэкенд:

app.post('/some_resource', multer({ dest: '../tmpUploads' }), function(req, res) { 
    // req.files is an object, where, in terms of the frontend 
    // and backend variables, req.files[fileNames[i]] = files[i] 
}); 
Смежные вопросы