2015-08-19 30 views
16

multipart/form-data türünde bir posta isteği kullanarak birden çok dosya yüklemek istiyorum ve her dosya için dosya boyutunu (içerik uzunluğunu) bilmem gerekiyor sunucu tarafı.İçerik uzunluğu üstbilgisini çok parçalı/form-veri yüklemesinin tek tek bölümlerine ayarlama

javascript içinde POST isteği oluşturmak için FormData nesnesini kullanıyorum ve bu dosyaya yükleme nesnelerini ekleyeceğim. Bu iyi çalışır, ancak her bir dosyaya Content-Disposition üstbilgisine ek olarak yalnızca Content-type başlığı eklenir, ancak bu bilgiler tek tek File nesnelerine ait olsa da Content-length başlığına eklenmez.

Content-length başlıklarının, isteği gönderirken FormData nesnesinin her bölümü için ayarlanmış olması için bir yol var mı?

Kullanımla ilgili sorunum dahil, kullandığım kod aşağıdadır. Bu isteği göndermek için aslında angular-js kullanır, ancak bunun soruyla alakalı olmadığını düşünüyorum.

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

Buna bir nimet ekledim, benim için de bir acı oldu. – James

+0

xD –

+0

isteğini oluşturmak için açısal kullanmayı teklif edecektim Neden buna ihtiyacın olduğunu açıklar mısınız? Normalde, sunucu tarafı kodu, sınır ayırıcıyı arayarak, başlıkların ayrıştırılması, vs - çoktan verilerdeki her "parçanın" büyüklüğünü çalışır. Her bölümün boyutunu bilmeniz gerekir * önce * her bir "parçanın" parçasını nedense ayırdınız? – sheltond

cevap

2

Aslında her form veri öğesi için özel bir başlık eklemek için bir yol yoktur inanmıyorum. Ben sunucuda bu işleme, ancak isteği şu şekilde görünecektir emin değilim

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

: Ancak neden dosya adının bir parçası olarak, içerik kullanım başlığına eklemek gerekmez:

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

Bu nedenle, karşılaştığım sorun, bir java geliştiricisinin başlık bilgilerini bir ham postaya kodladığı ve burada çoğaltabilecek gibi görünmediği işlevselliği çoğaltmaya çalışıyor. – James