Потоковая передача октета из запроса на S3 с помощью knox на node.js - PullRequest
3 голосов
/ 19 февраля 2011

Я пытаюсь передать поток октетов прямо на S3, используя knox на node.js.Поток октетов - это загрузка файла 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)

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

Я считаю, client.putStream принимает 4 параметра, например:

client.putStream(stream, filepath, {
  'Content-Length': file.length,
  'Content-Type': 'application/octet-stream',
  'x-amz-acl': 'private'
}, function(err, res) {
  ...
});
2 голосов
/ 12 октября 2011

Я делаю что-то вроде этого:

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();

});

Предполагая, что я получаю имя файла, номер детали и идентификатор загрузки из сообщения.

0 голосов
/ 14 апреля 2011

Если вы используете версию файла node.js, более раннюю, чем 0.4.5, обновите ее.

Найдите модуль утилит и используйте util.pump, чтобы скопировать файл извходной поток в выходной поток.Если файл должен быть загружен первым, просто используйте ReadStream из файла в качестве входного потока.

Также взгляните на код Javascript для util.pump , так как я подозреваючто вы не совсем поняли, как работает асинхронный ввод-вывод в node.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...