16

Я хотел бы загрузить несколько файлов, используя запрос на отправку типа multipart/form-data, и для каждого файла мне нужно знать размер файла (длина содержимого) на на стороне сервера.Задать заголовок длины контента для отдельных частей многостраничной загрузки/данных формы.

Чтобы построить запрос POST в javascript, я использую объект FormData и добавляю объекты File для его загрузки. Это отлично работает, но только заголовок Content-type добавляется к каждой части в дополнение к заголовку Content-Disposition, но нет заголовка Content-length, хотя эта информация доступна из отдельных объектов File.

Есть ли способ достичь того, что заголовки Content-length установлены для каждой части от объекта FormData при отправке запроса?

Ниже приведен код, который я использую, включая проблему с моей работой. Он действительно использует angular-js, чтобы отправить запрос, но я думаю, что это не относится к вопросу.

var form = new window.FormData(); 

form.append('additional-field-1', new Blob(['some plain text'], {type : 'text/plain'})); 

for (var file in fileList) { 
    var fileObj = fileList[file]; 
    var count = 1 + parseInt(file, null); 
    form.append('file-size-' + count, new Blob([fileObj.size], {type : 'text/plain'})); 
    form.append('file-' + count, fileObj); 
} 

$http.post(url, form, { 
    transformRequest: angular.identity, 
    headers: {'Content-Type': undefined} 
}).success(..... 
+0

Добавил щедрость к этому, также и боль для меня. – James

+0

Я собирался использовать угловую форму для запроса xD –

+0

Не могли бы вы объяснить, зачем это нужно? Обычно код на стороне сервера определяет размер каждой «части» в многочастных данных, ища разделитель границ, разбор заголовков и т. Д. - все, что осталось, - это данные. Вам нужно знать размер каждой части * до того, как вы разобрали тело каждой «части» по какой-то причине? – sheltond

ответ

2

Я не верю, что есть способ добавить пользовательский заголовок для каждого элемента данных формы. Однако, почему бы вам не добавить его в заголовок утилизируемого контента, как часть имени файла:

data = new FormData(); 
data.append('additional-field-1', new Blob(['some plain text'], {type : 'text/plain'})); 

for (var i = 0; i< $('#file')[0].files.length; i++) { 
    var fileObj = $('#file')[0].files[i]; 
    data.append('{ size : ' + fileObj.size + ' }' , $('#file' [0].files[i], $('#file')[0].files[i].name); 
} 

Я не знаю, как вы регулируете это на сервере, но запрос будет выглядеть следующим образом:

------WebKitFormBoundarysZxMHYOzMkqDmOvR 
Content-Disposition: form-data; name="additional-field-1"; filename="blob" 
Content-Type: text/plain 


------WebKitFormBoundarysZxMHYOzMkqDmOvR 
Content-Disposition: form-data; name="{ size : 22984 }"; filename="MatrixArithmetic.vshost.exe" 
Content-Type: application/x-msdownload 


------WebKitFormBoundarysZxMHYOzMkqDmOvR 
Content-Disposition: form-data; name="{ size : 187 }"; filename="MatrixArithmetic.vshost.exe.config" 
Content-Type: application/xml 


------WebKitFormBoundarysZxMHYOzMkqDmOvR-- 
+0

Итак, проблема, с которой я сталкиваюсь, заключается в попытке реплицировать функциональность, когда разработчик java жестко закодировал информацию заголовка в исходную запись и, похоже, не может быть реплицирован здесь. – James

 Смежные вопросы

  • Нет связанных вопросов^_^