File upload 使用node.js上的knox将八位字节流从请求流到S3

File upload 使用node.js上的knox将八位字节流从请求流到S3,file-upload,stream,amazon-s3,node.js,File Upload,Stream,Amazon S3,Node.js,我正在尝试使用on node.js将一个八位字节流直接传输到S3。八位字节流是从浏览器上载的XHR文件。我假设我可以将请求流式传输到putStream中,一切都可以正常工作,但可惜不行 这是我的密码: var client = knox.createClient({ // AWS credentials here }); if (req.headers['content-type'].match(/application\/octet-stream/i)

我正在尝试使用on node.js将一个八位字节流直接传输到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)

如果您使用的node.js版本比0.4.5旧得多,请升级

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


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

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

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

我在做这样的事情:

client.putStream(stream, filepath, {
  'Content-Length': file.length,
  'Content-Type': 'application/octet-stream',
  'x-amz-acl': 'private'
}, function(err, res) {
  ...
});
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();
app.post('/uploadAmazon',函数(req,res){
var params=req.query;
var request=client.request(“PUT”、“/”+req.header('x-file-name')+”?partNumber='+params.partNumber
+“&uploadId=”+params.uploadId{
“内容长度”:请求标头(“内容长度”)
} );
请求开启(“数据”,功能(数据){
请求。写入(数据);
});
请求.on('response',函数(response){
console.log('Partial'+params.partNumber+'statusCode:'+response.statusCode);
if(response.statusCode==200){
uploadMap[params.id].currentSize++;
uploadMap[params.id].CompleteMlArray[+(params.partNumber)-1]=''+params.partNumber+''+response.headers.etag+'';
if(uploadMap[params.id].currentSize==uploadMap[params.id].totalSize){
uploadMap[params.id].uploadId=params.uploadId;
completeSend(上传映射[params.id]);
}
}
}).end();
res.end();
}))

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