8

我一直在努力成功下载图像而不将其传送到 fs。这是我已经完成的:

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. 我已经尝试将它转换为Buffernew Buffer(body, 'binary')等)几种编码,但都失败了。

感谢您的帮助!

4

1 回答 1

21

你必须告诉request数据是二进制的:

requestAsync(uri, { encoding : null })

记录在这里

encoding- 在响应数据的 setEncoding 上使用的编码。如果为 null,则正文作为缓冲区返回。其他任何内容(包括 undefined 的默认值)都将作为编码参数传递给 toString() (这意味着默认情况下这实际上是 utf8)。

因此,如果没有该选项,正文数据将被解释为 UTF-8 编码,而事实并非如此(并产生无效的 JPEG 文件)。

于 2015-07-08T10:28:03.430 回答