在我的node.js应用程序中,我正在上传一个文件(保存到本地文件系统->/tmp/),从中创建Stream,并使用aws2js(Amazon CLI绑定)将该文件存储到我的S3bucket中。问题开始于在我做任何进一步操作之前,尝试使用putStream(…)将文件初始保存到S3。(使用"putFile(filepath)"有效!)
我的Bucket中的Entry被创建,回调没有给出任何错误。但是没有保存任何文件内容,并且条目有0个字节。
下面是我的代码;
....
var fileStream=fs.createReadStream(file.path),
savePath = _makeSavePath( file.name );
s3.putStream(savePath, fileStream, 'public-read', {'content-type': file.type.mime, 'content-length':file.length}, function (err, s3File) {
if (err){
console.error(err);
fileGetCB(err);
return;
}
console.log("SAVED TO S3 '"+savePath+"'!!");
//do further manipulations with fileStream
});
...
我可以保证,file
已初始化,并且file.path处的文件存在。
我之所以使用流而不使用S3.putFile(path)
,是因为我将进一步操作文件。通过使用流,我以后可以重用,这样不是每个模块都必须重新读取整个文件(也许甚至不可能"重用"流,但这还不是问题所在。)
我对任何方向的手都很有帮助,因为我不明白为什么这在4天的尝试中都不起作用;失败非常感谢。
实际上,我在GitHub上的原始帖子中犯了一个错误。aws2js在内部改变了Stream上传到S3的方式。
至于node.jsv0.6.9,它本身并不不稳定,但它对Expect:100-continue的处理有缺陷。
我联系了项目的所有者,他指出,节点处理流的方式在内部发生了变化。他还指出,node0.6.9目前并不稳定。我用Node 0.6.5(大转变后的版本)测试了我的脚本aws2js@0.6.4使用beeing。我正在使用上面描述的代码;它有效!耶!:)
您可能想从示例脚本repo:中看看AwsSum和这个例子
- https://github.com/appsattic/node-awssum/
- https://github.com/appsattic/node-awssum-scripts/blob/master/bin/amazon-s3-upload.js
AwsSum可以使用fs.createReadStream()流式传输文件,适用于节点v0.6.x的所有版本,并且也得到了积极维护。
让我知道你过得怎么样,是否需要帮助。
免责声明:我是AwsSum.的作者:)