使用节点请求下载图像,并使用fs Promisified,在Node.js中没有pipe道

我一直在努力成功地下载一个图像,而不用pipe道到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 () { ... }) // ... } 

有效的input可能是:

 downloadImage('http://goo.gl/5FiLfb', 'c:\\thanks.jpg'); 

我相信问题在于body的处理。 我曾尝试将其转换为Buffernew Buffer(body, 'binary')等),但都失败了。

感谢前方的任何帮助!

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

 requestAsync(uri, { encoding : null }) 

logging在这里 :

encoding – 编码用于setEncoding响应数据。 如果为null,则正文返回为Buffer。 其他任何东西( 包括未定义的默认值 )都将作为编码parameter passing给toString()(这意味着默认情况下是有效的)。

所以没有这个选项,主体数据被解释为UTF-8编码,而不是(并且产生无效的JPEG文件)。