我尝试使用亚马逊的S3服务,我设法将GZipped文件上传到我的存储桶但我无法检索它们。我尝试使用我发现here的代码示例,当我上传文件时一切正常,但我无法下载它们。 这是我的上传代码:
var s3 = new AWS.S3();
s3.headBucket({Bucket: bucketName}, function (err) {
if (err) s3.createBucket({Bucket: bucketName}, cb);
var body = fs.createReadStream(file).pipe(zlib.createGzip());
s3.upload({Bucket: bucketName, Key: key, Body: body}).send(cb);
});
这是我的下载代码:
var s3 = new AWS.S3();
var params = {Bucket: bucketName, Key: key};
var outFile = require('fs').createWriteStream(file);
s3.getObject(params).createReadStream().pipe(zlib.createGunzip()).pipe(outFile);
但我在最后一行得到error throw new Error('Cannot switch to old mode now.');
。
我无法弄清楚如何修复它,我使用节点0.10.25(我无法改变它)。
所以我尝试使用它:
var params = {Bucket: bucketName, Key: key};
s3.getObject(params, function(err, data) {
var outFile = require('fs').createWriteStream(file);
var read = AWS.util.buffer.toStream(data.Body);
read.pipe(zlib.createGzip()).pipe(outFile);
read.on('end', function(){cb();});
});
但我经常收到错误104(意外的输入结束)。
任何人都有一些想法?
答案 0 :(得分:2)
意外的输入结束可能是由于管道过早关闭或者在读取固定大小的块或数据结构时遇到了一些其他错误。
您可以查看 - https://github.com/minio/minio-js以及替代方案,它完全以Streams2风格编写。
这是一个例子。
$ npm install minio
$ cat >> get-object.js << EOF
var Minio = require('minio')
var fs = require('fs')
// find out your s3 end point here:
// http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
var s3Client = new Minio({
url: 'https://<your-s3-endpoint>',
accessKey: 'YOUR-ACCESSKEYID',
secretKey: 'YOUR-SECRETACCESSKEY'
})
var outFile = fs.createWriteStream('test.txt');
s3Client.getObject('mybucket', 'my-key', function(e, dataStream) {
if (e) {
return console.log(e)
}
dataStream.pipe(outFile)
})
EOF