2017-02-24 1 views
1

Ich versuche, Datei hochzuladen und einige Daten zur gleichen Zeit zu posten. Der Wert von topicSelected ist ein Java-Objekt-Array. Wenn ich den C# -Controller einchecke, ist der Wert von topicSelected null. Wenn ich den Wert in meinem Service überprüfe, ist alles in Ordnung. Ich denke, dass das Problem ist, dass ich den Anwendungs ​​/ JSON-Typ nicht angeben.Post Content-Type undefined und Anwendung/JSON zur gleichen Zeit

setNewVideoRecord = function(file, videoName, videoVersion, topicSelected) { 
    console.log(topicSelected); 
    var self = this; 
    var formData = new FormData(); 
    formData.append('file', file); 
    formData.append('videoName', videoName); 
    formData.append('videoVersion', videoVersion); 
    formData.append('topicSelected', topicSelected); 
    $http.post(self.baseUrl + "Admin/uploadVideoFile", formData, { 
     withCredentials: true, 
     headers: { 
      'Content-Type': undefined 
     }, 
     transformRequest: angular.identity 
    }).then(function onSuccess(response) { 
     self.fileNameUpload = null; 
    }) 
} 
+0

IMO, das ist auf jeden Fall keine gute Idee: eine Datei senden und Daten gleichzeitig veröffentlichen. Diese beiden Aktionen sollten in separaten Diensten ausgeführt werden. Einige unerwartete Verhalten können auftreten, z. B. Codierungsprobleme. – lealceldeiro

+1

Sie können die JSON-Zeichenfolge des Arrays anfügen, wie in 'formData.append ('topicSelected', JSON.stringify (topicSelected));' – remdevtec

+0

Das Senden von Dateien als Teil von 'multipart/form-data' wird nicht empfohlen Die [base64-Codierung] (https://en.wikipedia.org/wiki/Base64) fügt 33% zusätzlichen Overhead hinzu. – georgeawg

Antwort

3

Sie haben keinen undefinierten Inhaltstyp. Wenn Sie der Bibliothek mitteilen, dass der Inhaltstyp nicht definiert ist, wird der Versuch, einen eigenen Standardwert festzulegen, vom übergeordneten XMLHttpRequest-Objekt ignoriert. Da Sie ein FormData-Objekt übergeben, überprüft es das, um den richtigen Inhaltstyp zu identifizieren (der multipart/mixed sein soll).

Dadurch wird jedes Datenelement (einschließlich der Datei, die Sie hochladen) als separates Teil codiert, für das jeweils ein eigener Inhaltstyp automatisch festgelegt wird.

Sie können XHR nicht dazu bringen, die Nicht-Datei-Daten als JSON zu codieren. Es verwendet das Standard-Multipart-Format mit einem separaten Teil für jede Nicht-Datei-Eingabe (und einen anderen Teil für die Datei).

Sie müssen den serverseitigen Code schreiben, um dieses Format und nicht JSON zu erwarten.

Da topicSelected ist eine komplexe Datenstruktur (und kein String) Sie es durch JSON.stringify()vor laufen kann es auf die Formulardaten Objekt anhängen.

Sobald Sie die topicSelected Zeichenfolge gelesen haben, können Sie es von JSON auf dem Server analysieren.

+0

Eigentlich ist Wikipedia falsch. Für [FormData-Objekte] (https://developer.mozilla.org/en-US/docs/Web/API/FormData) die [XHR Send-Methode] (https://developer.mozilla.org/en-US/ docs/Web/API/XMLHttpRequest/send) setzt den Inhaltstypheader auf 'multipart/form-data'. – georgeawg

Verwandte Themen