2016-08-03 176 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