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的二进制日期。不幸的是,我看不清楚正确的答案,所以我会让其他人从这里开始…期待看到答案。我们有一个赢家!谢谢你的演奏!正如您所注意到的,安全提示是内容长度以字节为单位,而字符串长度以字符为单位。字符并不总是一个字节。