gpt4 book ai didi

node.js - nodejs 部分数据仅来自 firefox

转载 作者:搜寻专家 更新时间:2023-10-31 23:52:29 24 4
gpt4 key购买 nike

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

(提交的数据不一样,不过我觉得无所谓)

最佳答案

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

关于node.js - nodejs 部分数据仅来自 firefox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38737309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com