2012-02-28 4 views
4

Я пытаюсь создать способ загрузить файл с URL-адреса на s3 с помощью запроса и knox. В настоящее время мой код выглядит следующим образом:NodeJS: загрузка удаленного файла на S3 с запросом и knox

request(item.productImage, function(err, res, body) { 
    if (!err && res.statusCode == 200) { 
    fs.writeFile('/tmp/' + filename, body, 'base64', function(err, data){ 
     if (err) { 
     return console.log(err); 
     } 

     client.putFile('/tmp/' + filename, '/item/' + item._id + '/' + filename, function(err, res) { 
     if (err) { 
      return console.log(err); 
     } 
     }); 
    }); 
    } 
}); 

Это не работает, как он загружает около 652 байт файла 4kb, прежде чем он останавливается. Как ни странно, если я не предоставляю обратный вызов fs.writeFile(), он загружает весь 4kb локально.

Каков наилучший способ выполнения этого?

+0

Спасибо за вопрос. Я собирался задать тот же вопрос, и я тоже получил ответ. – user644745

ответ

10

Существует несколько вопросов об этом здесь, в Stackoverflow, но я не могу найти ответ на ваш вопрос. Решение ниже должно работать, однако у меня возникли проблемы с запуском knox на моей машине прямо сейчас. Надеюсь, тебе повезет больше!

UPDATE: я, кажется, были некоторые проблемы с s3 здесь, ниже код работает - я изменить одну вещь, вы должны указать encoding, как null просить, так что вы получите Buffer назад. В противном случае двоичные данные не будут работать так хорошо.

request(item.productImage, {encoding: null}, function(err, res, body) { 
    if(!err && res.statusCode == 200) { 
    var req = client.put('/item/' + item._id + '/' + filename, { 
     'Content-Type': res.headers['content-type'], 
     'Content-Length': res.headers['content-length'] 
    }); 

    req.on('response', function(res) { 
     console.log('response from s3, status:', res.statusCode, 'url:', req.url); 
    }); 

    req.on('error', function(err) { 
     console.error('Error uploading to s3:', err); 
    }); 

    req.end(body); 
    } 
}); 

Примечания: С помощью этого решения можно избежать необходимости буферизации файлов на диск - вот почему я решил использовать нижний уровень put метод клиента Нокса.

+1

Отлично. Мне пришлось изменить капитализацию «content-type» и «content-length», поскольку кажется, что S3 или Knox чувствительны к ней. Я получал 403 ошибки, пока не сделал. – James

+0

К сожалению, на самом деле у меня это было в моей тестовой программе. Отредактировано выше. Благодарю. –

+0

Я также использую это. Но я получаю код статуса 403. .... url также не кажется правильным. "ответ от S3, статус: 403 URL: http: //zzzzzz.s3.amazonaws.com \ static \ ima ges \ thumbnail \ abcd.jpg" – user644745

Смежные вопросы