我一直在努力下载一个没有管道到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
的处理上。我曾尝试将其转换为Buffer
(new Buffer(body, 'binary')
等)在几个编码中,但都失败了。
从前面感谢任何帮助!
您必须告诉request
数据是二进制的:
requestAsync(uri, { encoding : null })
记录:
encoding
-响应数据的setEncoding使用的编码。如果为空,则主体作为Buffer返回。其他任何内容(,包括默认值undefined)将作为编码参数传递给toString()(这意味着默认情况下这是有效的utf8)。
因此,如果没有该选项,body数据将被解释为UTF-8编码,而事实并非如此(并且会产生一个无效的JPEG文件)。