【问题标题】:nodejs partial data just from firefox仅来自Firefox的nodejs部分数据
【发布时间】:2016-08-08 23:13:11
【问题描述】:

我有一个在 nodejs 上运行的服务器,我有以下代码来管理发布请求 -

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,我喜欢这个异常是因为数据是按位来的,并且在第一位到达后触发事件,而我没有所有的数据。好的。问题是,经过一些测试后,我喜欢从 chrome 上传大文件(尝试了 1.75gb 文件)而没有任何问题,而 firefox 使用 6kb 文件使服务器崩溃。

我的问题是 - 为什么它们不同?

可以从here 下载示例捕获。第一篇来自chrome,第二篇来自firefox。

上传前完整的file.name字符串为:

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

(提交的数据不一样,但我觉得没关系)

【问题讨论】:

  • FF 和 Chrome 的输入有什么区别?
  • @Oleander 我添加了来自 wireshark 的捕获。

标签: node.js firefox formidable


【解决方案1】:

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

...然后被 Formidable 解码:

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

要解决此问题,您有几个选择:

  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, '"');

【讨论】:

  • 似乎没有奏效——在 nodejs JSON.parse("{\"test\" : 3}") 中运行会产生 {test: 3},而不是错误。另外,很奇怪,我只得到右括号,而根据你的理论,我应该得到左括号。
  • 我认为 stringg 在到达 JSON.parse 之前就已经被破坏了。你试过打印字符串吗?
  • 相同 - FF:name: "{"subject":"fdsa","lecturer"... chrome:name: "{"subject":"flksajfd","lecturer"...
  • @elyashiv 并且它们在打印后是否都正确解析,或者 FF 是否失败?你能用完整的字符串更新问题吗?
  • 我正在尝试重现这一点 - 您能否分享发送文件的客户端代码部分和/或将我指向您正在使用的客户端框架?
猜你喜欢
  • 2011-12-14
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多