nodejs仅来自firefox

时间:2016-08-03 07:38:55

标签: node.js firefox formidable

我有一个在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"}"

(提交的数据不一样,但我认为不重要)

1 个答案:

答案 0 :(得分: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

...然后由Formidable解码:

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

要解决此问题,您可以选择以下几种方法:

  1. Raise the issue with Formidable正确处理反斜杠转义的引用值字符串(或自行修复并提交拉取请求)。
  2. FormData对象的单独部分中发送JSON有效内容,例如using a Blob
  3. 将JSON格式文件名中的所有双引号字符音译为“安全”字符,该字符不会出现在字符串的其他位置(我选择^作为示例);替换引用客户端并在服务器端恢复如下。
  4. 客户端:

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