使用node-request和fs promisfied下载一个图像,在Node.js中没有管道



我一直在努力下载一个没有管道到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文件)。

最新更新