我有一个在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"}"
(提交的数据不一样,但我认为不重要)
答案 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
要解决此问题,您可以选择以下几种方法:
FormData
对象的单独部分中发送JSON有效内容,例如using a Blob
。^
作为示例);替换引用客户端并在服务器端恢复如下。客户端:
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, '"');