使用节点请求和 fs Promified 下载图像,Node.js 中没有管道
Download an image using node-request, and fs Promisified, with no pipe in 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 })
已记录 here:
encoding
- Encoding to be used on setEncoding of response data. If null, the body is returned as a Buffer. Anything else (including the default value of undefined) will be passed as the encoding parameter to toString() (meaning this is effectively utf8 by default).
因此,如果没有该选项,正文数据将被解释为 UTF-8 编码,而事实并非如此(并产生无效的 JPEG 文件)。
我一直在努力在不通过管道传输到 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 })
已记录 here:
encoding
- Encoding to be used on setEncoding of response data. If null, the body is returned as a Buffer. Anything else (including the default value of undefined) will be passed as the encoding parameter to toString() (meaning this is effectively utf8 by default).
因此,如果没有该选项,正文数据将被解释为 UTF-8 编码,而事实并非如此(并产生无效的 JPEG 文件)。