2015-08-19 11 views
16

Chciałbym przesłać wiele plików za pomocą żądania pocztowego typu multipart/form-data i dla każdego pliku potrzebuję znać rozmiar pliku (długość treści) na po stronie serwera.Ustaw nagłówek długości treści na poszczególnych częściach wieloczęściowego/przesyłania danych do formularza

Aby utworzyć żądanie POST w javascript, używam obiektu FormData i dołączam obiekty plików do przesłania do niego. Działa to dobrze, ale tylko nagłówek Content-type jest dodawany do każdej części oprócz nagłówka Content-Disposition, ale nie ma nagłówka Content-length, chociaż ta informacja jest dostępna z poszczególnych obiektów File.

Czy istnieje sposób, aby ustawić nagłówki Content-length dla każdej części z obiektu FormData podczas wysyłania zapytania?

Poniżej znajduje się kod, którego używam, w tym moje obejście problemu. To faktycznie używa angular-js, aby wysłać żądanie, ale myślę, że to nie jest istotne dla pytania.

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

Dodałem nagrodę za to, byłem także dla mnie bólem. – James

+0

Chciałbym zaproponować użycie kątowego do utworzenia zapytania xD –

+0

Czy mógłbyś wyjaśnić, dlaczego tego potrzebujesz? Zwykle kod po stronie serwera oblicza rozmiar każdej "części" w danych wieloczęściowych, szukając ogranicznika granicznego, analizując nagłówki itp. - wszystko, co pozostało, to dane. Czy musisz znać rozmiar każdej części * przed * analizujesz ciało każdej "części" z jakiegoś powodu? – sheltond

Odpowiedz

2

Nie sądzę, że istnieje sposób na dodanie niestandardowego nagłówka dla każdego elementu danych formularza. Jednak dlaczego nie można dodać go do zawartości Disposition, jako część nazwy pliku:

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

nie jestem pewien, w jaki sposób obchodzenia tego na serwerze, ale wniosek będzie wyglądać następująco:

------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

Więc problem, na który napotykam, polega na próbie replikowania funkcjonalności, w której programista java zakodował informacje nagłówkowe w surowym poście i nie wydaje się, aby prawdopodobnie mógł tu replikować. – James

Powiązane problemy