Загрузите изображение с помощью 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).

Другие вопросы по тегам