使用ExpressJS将经过Base64编码的图像发送为图像

5

我正在开发一个使用ExpressJS作为Web服务器的Node.JS应用程序。

我想设置一个路由/get/thumbnail/by_guid/:guid,它将返回一个真实的图像,而不是base64字符串,这样我就可以使用<img src="/get/thumbnail/by_guid/ABCD" >设置图像标签的源,实际图像将显示出来。

我将缩略图存储为数据库中的BLOB,并检索它们。当我检索它们时,它们在我的node应用程序中变成了缓冲区。然后,我将那些缓冲区作为下面所示的路由发送,其中img是包含图像的缓冲区对象。

router.get('/get/thumbnail/by_guid/:guid', function(req, res){
    image_helper.guidToImage(req.params.guid).then(function(img){
        res.set('Content-Type', 'image/jpeg');
        res.set('Content-Length', img.length);
        res.end(img, 'latin1');
    }, function(err){
        res.err(err);
    });
});

guidToImage返回图像的缓冲区。

当我访问一个缩略图的URL,例如/get/thumbnail/by_guid/ABCD时,我看到一个白色的框,如下所示:

White Box

当我查看chrome dev工具的网络选项卡时,请求如下:

enter image description here

响应只显示了我的base64字符串:

enter image description here

并且当我引用它时,图像显示为损坏状态:

enter image description here

我该如何实现我正在尝试的操作?

我已经花了6个小时来解决这个问题。

感谢您的帮助。


你如何在HTML中显示图片? - Jorg
@Jorg 就像我发布的那样:<img src="/get/thumbnail/by_guid/ABCD" > - user2172205
哦,对不起。如果源是base64,则需要指定:src="data:image/png;base64,[您的base64代码]... - Jorg
使用 atob 怎么样? - Phil
try res.end(img, 'binary'); - Vinay
显示剩余3条评论
1个回答

5

已更改路由以正确显示二进制文件。

router.get('/get/thumbnail/by_guid/:guid', function(req, res){
    image_helper.guidToImage(req.params.guid).then(function(img){
        var im = new Buffer(img.toString('binary'), 'base64');

        res.writeHead(200, {
        'Content-Type': 'image/jpg',
        'Content-Length': im.length
        });
        res.end(im);
    }, function(err){
        res.err(err);
    });
});

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