2015-08-19 12 views
16

Vorrei caricare più file utilizzando una richiesta di posta di tipo multipart/form-data e per ogni file ho bisogno di conoscere la dimensione del file (lunghezza del contenuto) su il lato server.Imposta intestazione lunghezza contenuto su singole parti di un caricamento multipart/form-data

Per creare la richiesta POST in javascript Uso un oggetto FormData e aggiungo gli oggetti File per il caricamento su di esso. Funziona bene, ma solo un'intestazione Content-type viene aggiunta a ciascuna parte, oltre all'intestazione Content-Disposition, ma non all'intestazione Content-length, sebbene queste informazioni siano disponibili dai singoli oggetti File.

C'è un modo per ottenere che le intestazioni Content-length siano impostate per ogni parte dall'oggetto FormData quando si invia la richiesta?

Di seguito è riportato il codice che uso, compreso il mio work-around per il problema. In realtà utilizza angular-js per inviare la richiesta, ma penso che questo non è rilevante per la domanda.

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

Aggiunto un dono a questo, è stato un dolore anche per me. – James

+0

Stavo per proporre l'uso angolare per formare la richiesta xD –

+0

Puoi spiegare perché hai bisogno di questo? Normalmente, il codice lato server elabora le dimensioni di ciascuna "parte" nei dati multipart cercando il delimitatore di confine, analizzando le intestazioni, ecc. - tutto ciò che resta sono i dati. È necessario conoscere la dimensione di ciascuna parte * prima * si analizza il corpo di ciascuna "parte" per qualche motivo? – sheltond

risposta

2

Non credo ci sia un modo per aggiungere effettivamente un'intestazione personalizzata per ogni elemento di dati del modulo. Tuttavia perché non lo si aggiunge alla testata disposizione contenuti, come parte del nome del file:

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

io non sono sicuro di come si gestisce questo sul server, ma la richiesta sarebbe simile a questa:

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

Quindi il problema che sto incontrando è quello di provare a replicare le funzionalità in cui uno sviluppatore Java ha codificato in modo rigido le informazioni dell'intestazione in un messaggio non elaborato e non sembra che sia probabile che sia in grado di replicare qui. – James

Problemi correlati