【问题标题】:Streaming an octet stream from request to S3 with knox on node.js使用 node.js 上的 knox 将八位字节流从请求流式传输到 S3
【发布时间】:2011-06-30 10:40:49
【问题描述】:

我正在尝试在 node.js 上使用 knox 将八位字节流直接流式传输到 S3。八位字节流是从浏览器上传的 XHR 文件。我以为我可以将请求流式传输到 putStream 中,一切都会正常工作,但可惜没有。

这是我的代码:

var client = knox.createClient({ 
           // AWS credentials here
         });
if (req.headers['content-type'].match(/application\/octet-stream/i)) {

  var filename = '/'+req.headers['x-file-name'];

  client.putStream(req, filename, function(err, res){
    // TODO: Catch errors
    body = '{"success":"true"}'
    res.writeHead(200, 
      { 'Content-Type':'text/html'
      , 'Content-Length':body.length
      })
    res.end(body)
  });

}

我收到的错误:

TypeError: Bad argument
    at Object.stat (fs.js:354:11)
    at Client.putStream (./lib/knox/client.js:181:6)

【问题讨论】:

    标签: file-upload stream amazon-s3 node.js


    【解决方案1】:

    我正在做这样的事情:

    app.post('/uploadAmazon', function(req, res) {  
    var params = req.query;
    
    var request = client.request("PUT", '/' + req.header('x-file-name') + '?partNumber=' + params.partNumber 
            + '&uploadId=' + params.uploadId, {
        'Content-Length' : req.header('Content-Length')
    } );
    
    req.on('data', function(data){
        request.write(data);
    });
    
    
    request.on('response', function(response) {
        console.log('Partial ' + params.partNumber + ' statusCode: ' + response.statusCode);
        if (response.statusCode== 200) {
            uploadMap[params.id].currentSize++;
            uploadMap[params.id].completeXmlArray[+(params.partNumber) - 1] = '<Part><PartNumber>' + params.partNumber + '</PartNumber><ETag>' + response.headers.etag + '</ETag></Part>' ; 
    
            if (uploadMap[params.id].currentSize == uploadMap[params.id].totalSize) {
                uploadMap[params.id].uploadId = params.uploadId;
                completeSend(uploadMap[params.id]);
            }
        }
    }).end();
    
    res.end();
    

    });

    假设我从帖子中收到文件名、部件号和uploadId。

    【讨论】:

      【解决方案2】:

      我相信client.putStream 接受 4 个参数,如下所示:

      client.putStream(stream, filepath, {
        'Content-Length': file.length,
        'Content-Type': 'application/octet-stream',
        'x-amz-acl': 'private'
      }, function(err, res) {
        ...
      });
      

      【讨论】:

        【解决方案3】:

        如果您使用的 node.js 版本远早于 0.4.5,请升级。

        查看util module 并使用 util.pump 将文件从输入流复制到输出流。如果必须先下载文件,只需使用文件中的 ReadStream 作为输入流。

        另外,请查看Javascript code for util.pump,因为我怀疑您还没有完全掌握 node.js 中异步 I/O 的工作原理。

        【讨论】:

          猜你喜欢
          • 2018-05-04
          • 1970-01-01
          • 2012-11-17
          • 2013-06-22
          • 2020-10-01
          • 1970-01-01
          • 2011-04-30
          • 1970-01-01
          相关资源
          最近更新 更多