mjh*_*jhm 2 javascript file-upload amazon-s3 node.js knox-amazon-s3-client
这是一个脑筋急转弯的问题,我实际上知道答案.我正在抛出一笔赏金,因为它代表了一个有价值的节点编程安全提示(这是第一个提示).
我正在使用
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);
Run Code Online (Sandbox Code Playgroud)
生成的上载被截断或以其他方式损坏.我们有stringVal.length === 322889,并且生成的S3项目大小与之匹配.但是下载并重新加载文件会产生一个长度为的字符串322140.在尝试使用JSON.parse字符串(可预测地)导致语法错误之前,没有错误出现.
这是怎么回事?
从knox-module(https://github.com/LearnBoost/knox/blob/master/lib/client.js)的源代码中,您可以了解到它使用的是标准http请求.
req.write并req.end默认从'utf8'转换字符串(http://nodejs.org/api/http.html#http_request_end_data_encoding).
所以真正发生的是你不小心通过设置字符串长度而不是'Content-Length'字段中的字节数来切断字符串的结尾.服务器扔掉的东西比这更长; 因此,当您解析字符串时,您会收到错误.
最快的修复方法是:
'Content-Length': new Buffer(stringVal).length,
Run Code Online (Sandbox Code Playgroud)
甚至更快:只需删除'Content-Length'行.
| 归档时间: |
|
| 查看次数: |
1087 次 |
| 最近记录: |