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

Posted

技术标签:

【中文标题】使用 node-request 和 fs Promisified 下载图像,在 Node.js 中没有管道【英文标题】:Download an image using node-request, and fs Promisified, with no pipe in Node.js 【发布时间】:2015-09-26 04:42:00 【问题描述】:

我一直在努力成功下载图像而不将其通过管道传输到 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') 等),但都失败了。

感谢您的帮助!

【问题讨论】:

知道如何使用流来做到这一点吗? 【参考方案1】:

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

requestAsync(uri,  encoding : null )

记录在案的here:

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

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

【讨论】:

谢谢!我不知道我是怎么错过的。 :) 这个答案帮助我最终保存了我使用request-promise 获取的有效 PDF。我试过every encoding supported by Node.js,但生成的文件总是损坏(并且比它应该的大)。原来问题在于它是如何重新开始的。添加encoding: null 修复了它,然后无论我在fs.writeFile() 期间使用哪种编码,它都能很好地保存。谢谢!

以上是关于使用 node-request 和 fs Promisified 下载图像,在 Node.js 中没有管道的主要内容,如果未能解决你的问题,请参考以下文章

[从`prom-client`模块导入`prom`,但已安装。如何“相应地导入prom-client”?

Promise的应用

无法使用 docker (prom/prometheus) 加载 prometheus.yml 配置文件

EE2PROM

EE2PROM

无法使用docker(prom / prometheus)加载prometheus.yml配置文件