2016-08-03 229 views
3

的NodeJS部分數據我有一個服務器上的NodeJS運行,並且我有如下一段代碼來管理POST請求 - 當我試圖上傳文件,我得到了以下異常剛剛從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,我喜歡,由於數據來自於位,第一位到達後,該事件被解僱,我沒有所有的數據此異常引起的。好。事情是,經過一些測試,我喜歡從鉻我可以上傳大文件(嘗試1.75GB文件)沒有任何問題,而Firefox的崩潰與6kb文件的服務器。

我的問題是 - 他們爲什麼不同?

樣本採集可以從here下載。第一篇文章來自Chrome,第二篇來自Firefox。

,然後再上傳完整file.name字符串是:

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

(提交的數據是不一樣的,但我不認爲它很重要)

+0

什麼是輸入FF和Chrome之間的差異? – Oleander

+0

@Oleander我從wireshark添加了一個捕獲。 – elyashiv

回答

2

Chrome瀏覽器時編碼雙引號JSON編碼的「文件名」爲%22,而Firefox將它們編碼爲\"

您的文件上傳解析庫,Formidable,明確truncates the filename from the last \ character。它預計雙引號編碼爲%22,儘管RFC 2616允許像Firefox實施的反斜線轉義引號。你可以認爲這是一個在Formidable中的錯誤。其結果是,以下JSON字符串:

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

...編碼如下:

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

...然後厲害解碼:

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

要修復問題你有幾個選擇:

  1. Raise the issue with Formidable正確處理反斜槓轉義的引用值字符串(或自己修復並提交拉請求)。
  2. 將JSON有效載荷發送到FormData對象的單獨部分,例如, 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

我認爲stringg在它到達'JSON.parse'之前就已經被破壞了。你嘗試打印字符串嗎? – Owen

+0

相同 - FF:'name:「{」subject「:」fdsa「,」lecturer「...'chrome:'name:」{「subject」:「flksajfd」,「lecturer」...' – elyashiv