2016-08-03 8 views
3

Ich habe einen Server auf NodeJS ausgeführt wird, und ich habe das folgende Stück Code, um eine Post-Anforderung zu verwalten -NodeJS Teildaten nur von firefox

form.on('file', function (field, file) { 
    var RecordingInfo = JSON.parse(file.name); 
... 

, wenn ich eine Datei, die ich die folgende Ausnahme bekam zu laden versucht :

undefined:1 
"} 


SyntaxError: Unexpected end of input 
    at Object.parse (native) 
    at IncomingForm.<anonymous> (.../root.js:31:34) 
... 

searching around the web ich gern, dass diese Ausnahme verursacht, weil die Daten in Bits kommt, und das Ereignis ausgelöst wird, nachdem das erste Bit ankommt, und ich habe nicht alle Daten. OK. Die Sache ist, nach ein wenig Testen, dass ich das von Chrome mag, kann ich große Dateien hochladen (probierte eine 1,75 GB-Datei) ohne jedes Problem, während Firefox den Server mit einer 6 KB-Datei abstürzt.

Meine Frage ist - warum sind sie anders?

Eine Beispielaufnahme kann von here heruntergeladen werden. Der erste Beitrag stammt von Chrome, der zweite von Firefox.

Der komplette file.name Zeichenfolge vor dem Hochladen ist:

// chrome 
"{"subject":"flksajfd","lecturer":"אבישי וינר","path":"/גמרא","fileType":".png"}" 
// firefox 
"{"subject":"fdsa","lecturer":"אלקס ציקין","path":"/גמרא","fileType":".jpg"}" 

(Die vorgelegten Daten ist nicht das Gleiche, aber ich glaube nicht, dass es wichtig ist)

+0

Was ist der Unterschied zwischen dem Eingang für FF und Chrome? – Oleander

+0

@Oleander Ich habe eine Aufnahme von wireshark hinzugefügt. – elyashiv

Antwort

2

Chrome in doppelte Anführungszeichen Encodieren der JSON-codierte "Dateiname" als %22, während Firefox sie als \" codiert.

Ihre Parsing-Bibliothek zum Hochladen von Dateien, Formidable, explizit truncates the filename from the last \ character. Er erwartet, dass doppelte Anführungszeichen als %22 codiert werden, obwohl RFC 2616 Backslash-Escape-Anführungszeichen wie Firefox implementiert hat. Sie können dies als einen Fehler in Formidable betrachten. Das Ergebnis ist, dass die folgende JSON string:

'{"subject":"fdsa",...,"fileType":".jpg"}' 

... codiert wird, wie folgt:

'{%22subject%22:%22fdsa",...,%22fileType%22:%22.jpg%22}' // Chrome 
'{\"subject\":\"fdsa\",...\"fileType\":\".jpg\"}' // Firefox 

... und dann durch Formidable dekodierten:

'{"subject":"fdsa",..."fileType":".jpg"}' // Chrome 
'"}' // Firefox 

Zur Fixierung der Ausgabe Sie haben ein paar Möglichkeiten:

  1. Raise the issue with Formidable, um mit Backslash-Escapezeichen versehene Zeichenfolgen mit Anführungszeichen korrekt zu behandeln (oder sie selbst zu reparieren und eine Pull-Anforderung zu senden).
  2. Senden Sie die JSON-Nutzlast in einem separaten Teil des Objekts FormData, z. using a Blob.
  3. Transliterieren Sie alle doppelten Anführungszeichen in Ihrem JSON-Format-Dateinamen in ein 'sicheres' Zeichen, das nicht an anderer Stelle in der Zeichenfolge erscheint (ich wählte ^ als Beispiel); Ersetzen Sie das Zitat clientseitig und setzen Sie es serverseitig wie folgt wieder ein.

Auftraggeber:

var formData = new FormData(); 
    formData.append('file', $scope.recording, JSON.stringify(RecordingInfo).replace(/"/g, '^'); 

Server

form.on('file', function (field, file) { 
    var RecordingInfo = JSON.parse(file.name.replace(/\^/g, '"'); 
+0

scheint nicht den Trick zu tun - läuft in nodejs 'JSON.parse (" {\ "test \": 3} ")' '{test: 3}', und kein Fehler. Seltsamerweise bekomme ich auch nur die schließende Klammer, während ich nach deiner Theorie die öffnende Klammer bekommen sollte. – elyashiv

+0

Ich denke, der Stringg wurde gemangelt, bevor er die 'JSON.parse' erreicht. Haben Sie versucht, die Zeichenfolge zu drucken? – Owen

+0

das gleiche - FF: 'name:" {"subjekt": "fdsa", "lektor" ... 'chrome:' name: "{" subject ":" flksajfd "," lektor "...' – elyashiv

Verwandte Themen