【问题标题】:Can't download AWS S3 File in nodejs无法在nodejs中下载AWS S3文件
【发布时间】:2015-11-07 05:26:16
【问题描述】:

我正在尝试使用 Amazon 的 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(输入意外结束)。

有人有什么想法吗?

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-s3


    【解决方案1】:

    输入意外结束可能是由于管道过早关闭或在读取固定大小的块或数据结构的过程中遇到了其他错误。

    您可以查看 - 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
    

    【讨论】:

    • 嗨,很抱歉回复晚了,我发现输入结束不是我的代码错误,我最终下载了s3.getObject(params).on('httpData', function (chunk) { wStream.write(chunk); }). on('httpDone', function () { wStream.end(); }). send(); 的文件
    猜你喜欢
    • 2021-06-26
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2021-04-19
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多