下载映像并将其转换为base64会导致数据损坏

时间:2019-04-01 12:43:05

标签: node.js image download base64 encode

我尝试使用got下载图像,并使用Buffer接口作为responsetype将其转换为base64编码的字符串。我当前的代码段将转换图像并将编码后的字符串记录到控制台:

'use strict';

const got = require('got');
const imgUrl = 'https://www.google.de/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png'


got(imgUrl, {
    responseType: 'buffer'
})
.then(response => Buffer.from(response.body, 'binary').toString('base64'))
.then(console.log)

我通过将任何终端输出重定向到这样的文件来将base64编码的字符串写到文件中:

node base64.js >> base64_image

我打开了文件并将其内容复制到online base64-image-viewer上,该文件显示损坏的图像符号,而不是所需的图像。

我的下载和编码方法是否错误,还是我错过了其他事情?我如何缩小问题范围以解决此错误?

2 个答案:

答案 0 :(得分:1)

没有responseType属性。您必须使用encoding属性,该属性默认为utf8

got(imgUrl, {
    encoding: null
})
.then(response => response.body.toString('base64'))
.then(console.log)

或直接:encoding: 'base64'

got(imgUrl, {
        encoding: 'base64'
    })
    .then(response => response.body)
    .then(console.log)

否则,您将尝试从utf8编码的图像转换回来,这就是为什么它损坏了的原因。您无法将图像转换为utf8,然后再转换回。

答案 1 :(得分:0)

为了完整起见,为了人和人,在将来遇到我的问题时,让我总结一下基于the accepted answer的最终方法,并在所需的data:image/png;base64前面加上以下内容:

'use strict';

const got = require('got');

const imgUrl = 'https://www.google.de/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png'


got(imgUrl, {
    encoding: 'base64'
})
.then(response => {
    const contentType = response.headers["content-type"];
    const imgData = response.body;
    const encodedImage = `data:${contentType};base64,${imgData}`;
    return encodedImage;
})
.then(console.log)