Javascript knox S3上载损坏或截断的文件
这是一个脑筋急转弯的问题,我实际上知道答案。我对它进行奖励,因为它代表了一个有价值的节点编程安全提示(这是第一个提示)Javascript knox S3上载损坏或截断的文件,javascript,node.js,file-upload,amazon-s3,knox-amazon-s3-client,Javascript,Node.js,File Upload,Amazon S3,Knox Amazon S3 Client,这是一个脑筋急转弯的问题,我实际上知道答案。我对它进行奖励,因为它代表了一个有价值的节点编程安全提示(这是第一个提示) 提示2:在HTTP请求中,“内容长度”头字段的单位是什么 我正在使用 var knox = require('knox'); var s3 = knox.createClient({ key: ..., secret: ..., bucket: ... }); // The bug is below: var stringVal = JSON.s
- 提示2:在HTTP请求中,“内容长度”头字段的单位是什么
var knox = require('knox');
var s3 = knox.createClient({
key: ...,
secret: ...,
bucket: ...
});
// The bug is below:
var stringVal = JSON.stringify(<2d javascript array from a large spreadsheet>)
var req = s3.put(path + filename, {
'Content-Length': stringVal.length,
'Content-Type': 'application/json'
});
req.end(stringVal);
var knox=require('knox');
var s3=knox.createClient({
关键字:。。。,
秘密:。。。,
桶:。。。
});
//错误如下:
var stringVal=JSON.stringify()
var req=s3.put(路径+文件名{
“内容长度”:stringVal.Length,
“内容类型”:“应用程序/json”
});
请求结束(stringVal);
结果上载被截断或损坏。我们有stringVal.length==322889
,得到的S3项大小与之匹配。但是下载和重新加载文件会产生一个长度为322140的字符串。在尝试对字符串进行JSON.parse之前,不会出现任何错误,这(可以预见)会导致语法错误
怎么了?从
knox
-模块()的源代码中,您可以了解到它使用标准的http
-请求
req.write
和req.end
默认情况下从“utf8”转换字符串()
因此,实际情况是,您通过设置字符串长度而不是“内容长度”字段中的字节数,意外地切断了字符串的结尾。服务器丢弃的所有东西都比这长;因此,当您解析字符串时,您会得到一个错误
最快的解决办法是:
'Content-Length': new Buffer(stringVal).length,
或者更快:只需删除“内容长度”行。如果S3项目大小与预期相符,则问题一定出在下载代码中。请出示一下好吗?下载的文件大小与S3项目大小完全相同。我正在用S3 Fox下载。但是,重新加载的字符串的长度较小。如果不查看所有代码,则很难诊断问题。我会尝试从更小的东西开始,看看输入和输出之间是否存在差异。如果没有,它可能是一个大小的东西,虽然我不知道为什么会是。322140这个数字没有什么神奇之处(尤其不是二的幂),所以我怀疑问题出在别处。我有一个坦白。我确实知道问题是什么,并将此作为一个问题发布,因为这是我很久以来遇到的最微妙的错误之一。您需要的所有代码都在问题中。我花了半天的时间才把问题缩小到这一步,但在那之后的几个小时里,我还是被难住了。提示:为什么节点实现“缓冲区”类型?啊。根据您的提示,这一定是编码问题,因为节点实现缓冲区对象的原因是处理不一定是Unicode的二进制日期。不幸的是,我看不清楚正确的答案,所以我会让其他人从这里开始…期待看到答案。我们有一个赢家!谢谢你的演奏!正如您所注意到的,安全提示是内容长度以字节为单位,而字符串长度以字符为单位。字符并不总是一个字节。