2016-08-03 16 views
3

から一部のデータをnodejs私はnodejs上で実行しているサーバーを持っている、と私はポストの要求を管理するために次のコードを持っている - 私は、次の例外が発生しましたファイルをアップロードしようとしたときはちょうどFirefoxの

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

を:

undefined:1 
"} 


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

searching around the web

、Iデータはビットに来て、イベントは最初のビットが到着した後に解雇され、私はすべてのデータを持っていないため、この例外が発生していることが好き。 OK。問題は少しテストした後、私はクロームからfirefoxが6kbのファイルでサーバをクラッシュする間に大きなファイル(1.75gbのファイルを試してみました)を問題なくアップロードできることが気に入っています。

私の質問です - なぜ違いますか?

サンプルキャプチャは、hereからダウンロードできます。最初の投稿はchromeから、2番目はfirefoxからです。アップロードする前に

完全file.name文字列は次のとおりです。

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

(提出されたデータが同じではありませんが、私はそれが重要とは思わない)

+0

FFとChrome用の入力間のdiffは何ですか? – Oleander

+0

@Oleander wiresharkからキャプチャを追加しました。 – elyashiv

答えて

2

Chromeはに二重引用符をエンコードしていますJSONでエンコードされた「ファイル名」は%22、Firefoxでは\"とエンコードされています。

ファイルアップロード解析ライブラリFormidableは、明示的にtruncates the filename from the last \ characterです。二重引用符は%22とエンコードされると予想されますが、RFC 2616ではFirefoxのようにバックスラッシュエスケープされた引用符を使用できます。これはFormidableのバグと考えることができます。

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

...そして強敵によって復号化:次のようにエンコードされ

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

...:

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

修正するには、結果は次のようなJSON文字列ということですいくつかの選択肢があります:

  1. Raise the issue with Formidableでは、バックスラッシュでエスケープされた引用符付きの文字列を正しく処理する(または自分で修正してプルリクエストを送信する)ようにしました。
  2. FormDataオブジェクトの別の部分にJSONペイロードを送信します。 using a Blob
  3. JSON形式のファイル名に含まれるすべての二重引用符を文字列内の他の場所には表示されない「安全な」文字に変換します(例として^を選択しました)。見積もりクライアント側を置き換えて、次のようにサーバー側を元に戻します。

クライアント:

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

サーバー

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

はnodejsのJSON.parse( "{\" test \ ":3}")でトリックを実行していないようで、エラーではなく '{test:3}'を返します。また、あなたの理論によれば、私は開き括弧を取得する必要がありますが、非常に奇妙なことに、私は閉じ括弧を取得します。 – elyashiv

+0

文字列gは、JSON.parseに到達する前にマングルされていると思います。文字列を印刷しようとしましたか? – Owen

+0

同じ - FF: '名前:" {"件名": "fdsa"、 "講師" ...クロム: '名前:" {"件名": "flksajfd"、 "講師" ... ' – elyashiv

関連する問題