16

Ich möchte mehrere Dateien mit einer Post-Anfrage vom Typ multipart/form-data hochladen und für jede Datei muss ich die Dateigröße (Content-Length) kennen die Serverseite.Content-Length-Header auf einzelne Teile eines Multipart/Form-Daten-Uploads setzen

Um die POST Anfrage in javascript zu erstellen, verwende ich ein FormData Objekt und fügen Sie die Dateiobjekte für den Upload an. Dies funktioniert gut, aber nur ein Content-type Header zu jedem Teil hinzugefügt wird, zusätzlich zu der Content-Disposition Header, aber keine Content-length Header, obwohl diese Informationen von den einzelnen Dateiobjekte verfügbar ist.

Gibt es eine Möglichkeit zu erreichen, dass Content-length Header für jedes Teil aus dem FormData Objekt beim Senden der Anfrage festgelegt werden?

Unten ist der Code, den ich verwende, einschließlich meiner Arbeit um das Problem. Es verwendet tatsächlich angular-js, um die Anfrage zu senden, aber ich denke, dass dies für die Frage nicht relevant ist.

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

Hinzugefügt ein Kopfgeld, das war ein Schmerz für mich auch. – James

+0

Ich wurde vorschlagen, eckig zu verwenden, um die Anfrage xD –

+0

zu erstellen Könnten Sie erklären, warum Sie das brauchen? Normalerweise berechnet der serverseitige Code die Größe jedes "Teils" in den mehrteiligen Daten, indem er nach dem Begrenzungsbegrenzer sucht, die Header analysiert usw. - was immer noch übrig ist, sind die Daten. Müssen Sie die Größe jedes Teils * wissen, bevor Sie den Körper jedes "Teils" aus irgendeinem Grund analysieren? – sheltond

Antwort

2

Ich glaube nicht, dass es eine Möglichkeit gibt, einen benutzerdefinierten Header für jedes Formulardatenelement hinzuzufügen. Doch warum Sie es auf den Inhalt Disposition Header als Teil des Dateinamens nicht hinzufügen:

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

Ich bin nicht sicher, wie Sie dies auf dem Server arbeiten, sondern die Anforderung würde wie folgt aussehen:

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

Das Problem, auf das ich stoße, ist der Versuch, die Funktionalität zu replizieren, bei der ein Java-Entwickler die Header-Informationen in einen unformatierten Post fest codiert hat und es nicht wahrscheinlich ist, dass er hier repliziert werden kann. – James

Verwandte Themen