从URL获取图像缓冲区

6

我花了几个小时尝试将图像数据作为缓冲区获取,搜索结果指导我使用 "request" 模块,其他建议则指导我使用更高版本的 node 中的其他模块,但我们目前依赖于 node v6.11,因此无法使用这些模块。

以下是我的尝试:

request(imageURL).pipe(fs.createWriteStream('downloaded-img-
1.jpg')).on('close', function () {
        console.log('ok');
});

request(imageURL, function (err, message, response) {
fs.writeFile('downloaded-img-2.jpg', response, 'binary', function (err) {
    console.log('File saved.');
});

fs.writeFile('downloaded-img-3.jpg', chunks, 'binary', function (err) {
        console.log('File saved.');
})

resolve(response);
})
.on('data', function (chunk) {
    chunks.push(chunk);
})
.on('response', function (response) {

});
});

"downloaded-img-1.jpg"可以正确下载,但是我必须避免将文件保存到磁盘上,然后作为流读取,因为这是一个生产环境的限制。因此,下一个选项是使用图像数据,如“downloaded-img-2.jpg”和“downloaded-img-3.jpg”所示,通过等待“响应”或手动制作的“块”,问题是这两个图像始终损坏,我不知道原因是什么?
这一切背后的意义是什么?我试图将URL后面的图像添加到zip文件中,我使用的zip库(js-zip)接受缓冲区作为输入。任何想法为什么我无法正确获取“块”或“响应”?

将图像转换为base64,然后通过块传递获取的数据怎么样? - DanilGholtsman
你的意思是在浏览器中读取base64吗?你会得到CORS错误,因为这些图片不在我们的域名内。 - Ihab
1个回答

3

我在Node 6.9.2中测试了下面的代码,它将以缓冲区形式下载图像。我还将缓冲区写入文件(只是为了测试一切是否正常!),body对象是一个包含图像数据的缓冲区:

"use strict";

var request = require('request');
var fs = require('fs');

var options = {
    url: "https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Hubble2005-01-barred-spiral-galaxy-NGC1300.jpg/1920px-Hubble2005-01-barred-spiral-galaxy-NGC1300.jpg",
    method: "get",
    encoding: null
};

console.log('Requesting image..');
request(options, function (error, response, body) {

    if (error) {
        console.error('error:', error);
    } else {
        console.log('Response: StatusCode:', response && response.statusCode);
        console.log('Response: Body: Length: %d. Is buffer: %s', body.length, (body instanceof Buffer));
        fs.writeFileSync('test.jpg', body);
    }
});

2
选项起了作用!我太天真了,以为只需传递一个URL就可以工作。谢谢Terry。 - Ihab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接