1

我正在尝试通过以下代码使用 knox 写入 S3:

var knox = require('knox');

var client = knox.createClient({
    key: 'key'
    , secret: 'pass'
    , bucket: S3_BUCKET
});

fs.stat("/opt/files/" + url, function(err, stats) {
     if (stats != null && stats.size != 0){
           var req = client.put(url, {
      'Content-Length': stats.size
        });
        req.on('error' ,function (err){
            console.log(err);
        })
        var readstr = fs.createReadStream("/opt/files/" + url);
        readstr.pipe(req);
        readstr.on('error', function (err){
          console.log(err);
        })

对于大文件,它给了我以下错误(我检查了 900MB 的文件):

{ [Error: write ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'write' }

证书没问题,我成功使用密钥和秘密访问密钥登录到亚马逊和其他 npm 包。此外,我成功地用 Knox 上传小文件。

我知道它连接错误,但我不明白它为什么会发生以及如何解决它。

4

2 回答 2

0

你没有做任何回应。尝试为请求中的“响应”事件添加侦听器,例如

req.on('response', function(res){
  // ...
});
于 2014-08-22T18:26:28.193 回答
0

您可能正在达到亚马逊方面存在的“大文件”限制。

根据他们的常见问题解答,对于大于 100MB 的对象,用户应该使用“分段上传”。

为此,您可以使用“know-mpu”模块,您的示例将变为

var knox = require('knox');
var MultiPartUpload= require('knox-mpu');

var client = knox.createClient({
    key: 'key'
    , secret: 'pass'
    , bucket: S3_BUCKET
});

var upload = new MultiPartUpload(
        {
            client: client,
            objectName: url,
            file: '/opt/files' + url
        },
        function(err, body) {
           console.log(body);
        }
    );
于 2014-08-20T11:07:28.410 回答