使用base64字符串的fs.writeFile损坏

时间:2019-01-15 14:17:07

标签: node.js fs

该文件显示为ok,但是Photos表示它是不受支持的格式。该文件似乎也比我预期的要小得多(16kb)。

router.post('/image/upload/gamethumb',
(req, res) => {
    const destination = keys.imageLocation + "cards/";
    console.log(req.body.image);
    fs.writeFile(destination + req.query.title + ".png", req.body.image, 'base64',
    () => {res.json({image: 'Uploaded'});
}
    )
});

req.body.image的开始是:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA ...

,如果我将其粘贴到chrome中,则渲染效果很好。

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

问题在于req.body.image包含一个数据URL ,而不仅仅是图像主体。 base64图像数据在逗号后开始。您当前的代码意外地对数据URL标头(data:image/png等)进行了编码,就好像它是图像的一部分一样,而不是。

简单修复:

const base64Data = req.body.image.split('base64,')[1];
fs.writeFile(destination + req.query.title + ".png", base64Data, 'base64', ...);

(此代码假定传入的图像始终正确;如果需要,您可以添加一些其他逻辑以确保前缀实际上是data:image/png;base64,等。)

答案 1 :(得分:1)

req.body.image字符串不是真实图像。

让我们删除标题,然后将图像字符串作为图像保存到文件中

let base64Image = base64String.split(';base64,').pop();
fs.writeFile(req.query.title + ".png", base64Image, {encoding: 'base64'}, (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('File created');
});