nodejs - 使用fs.createReadStream,requestjs,流和AWS S3预先签署的url抛出错误

时间:2014-03-29 23:43:10

标签: node.js amazon-s3 pre-signed-url

我的环境:Windows 8.1,NodeJS 0.10.0请求2.30.0

这是我根据Amazon SDK的样本和requestjs的文档

尝试的
var params = {Bucket:'myprivateuniquebucket'
    ,Key:'mykey'
    ,Expires: 60};
var url = s3.getSignedUrl('putObject', params);
fs.createReadStream('pic.png').pipe(request.put(url));

这是我得到的错误

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: read ECONNRESET
at errnoException (net.js:863:11)
at TCP.onread (net.js:524:19)

然而,当我使用fs.readFile时,不是使用fs.createReadStream,而是一切都运行得很好

    fs.readFile('pic.png', function (err, data) {
        request(
            { method: 'PUT'
                , uri: url
                , body: data
            }
            , function (error, response, body) {
            }
        );
    });

注意我几乎逐字地遵循了流媒体示例https://github.com/mikeal/request

由于我想在多个地方使用流媒体,因此我非常感谢有关错误的指示。

1 个答案:

答案 0 :(得分:1)

这主要是亚马逊的API而不是您的代码的问题。将文件上载到Amazon需要设置Content-Length标头。在您的流示例中,长度未知,因此Amazon正在删除连接。在第二个示例中,request知道缓冲区的长度并为您设置Content-Length

如果您因为文件很大而流式传输并将其全部加载到RAM中很困难,那么您将需要使用Amazon的多部分上传API。如果你是流媒体但文件很小,那么我可能会坚持使用readFile方法。