Загрузите изображение с помощью node-request и fs Promisified без канала в Node.js
Я изо всех сил пытался преуспеть в загрузке изображения без передачи его в фс. Вот что я сделал:
var Promise = require('bluebird'),
fs = Promise.promisifyAll(require('fs')),
requestAsync = Promise.promisify(require('request'));
function downloadImage(uri, filename){
return requestAsync(uri)
.spread(function (response, body) {
if (response.statusCode != 200) return Promise.resolve();
return fs.writeFileAsync(filename, body);
})
.then(function () { ... })
// ...
}
Допустимый ввод может быть:
downloadImage('http://goo.gl/5FiLfb', 'c:\\thanks.jpg');
Я верю, что проблема с обработкой body
, Я пытался привести его к Buffer
(new Buffer(body, 'binary')
и т.д.) в нескольких кодировках, но все не удалось.
Спасибо заранее за любую помощь!
1 ответ
Ты должен сказать request
что данные являются двоичными:
requestAsync(uri, { encoding : null })
Документировано здесь:
encoding
- Кодировка для использования при setEncoding данных ответа. Если ноль, тело возвращается как Буфер. Все остальное (включая значение по умолчанию undefined) будет передано в качестве параметра кодирования toString() (это означает, что по умолчанию это utf8).
Таким образом, без этой опции данные тела интерпретируются как кодированные в кодировке UTF-8, а это не так (и приводит к неверному файлу JPEG).