1

我的环境: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 。

由于我想在多个地方使用流媒体,因此我很感激有关不正确之处的指示。

4

1 回答 1

1

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

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

于 2014-03-30T17:36:28.227 回答