如何在 NodeJS/Express 中验证 Base64 图像?

Hay*_*den 8 base64 node.js express

假设我正在使用 Node/Express 创建 REST API,并且数据通过 JSON 在客户端和服务器之间交换。

用户正在填写注册表,其中一个字段是用于上传个人资料图像的图像输入。图片无法通过 JSON 发送,因此必须转换为 Base64 字符串。

如何验证这确实是服务器端图像的 Base64 字符串?或者最好的做法是不要将个人资料图像作为 base64 发送?

TGr*_*rif 7

您可以首先检查字符串是否是具有正确 MIME 类型的 Base64 图像。
我在 npm 注册表上发现这个库正是这样做的(未经测试)。

const isBase64 = require('is-base64');
let base64str_img = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAoHBwgHBgoIC...ljA5GC68sN8AoXT/AF7fw7//2Q==';

console.log(isBase64(base64str_img, { mime: true })); // true
Run Code Online (Sandbox Code Playgroud)

然后,您可以验证应用程序中是否允许使用 mime 类型,或者进行其他验证,例如尝试显示图像文件并捕获可能的错误。

无论如何,如果你想真正确定用户输入,你首先必须自己处理它。这是您应该关心的最佳实践。


Vic*_*tor 7

仅当其解码数据具有正确的 MIME 类型且宽度和高度大于零时,Base64 值才是有效图像。检查这一切的一个方便方法是安装jimp包并按如下方式使用它:

var b64 = 'R0lGODdhAQADAPABAP////8AACwAAAAAAQADAAACAgxQADs=',
buf = Buffer.from(b64, 'base64');

require('jimp').read(buf).then(function (img) {
    if (img.bitmap.width > 0 && img.bitmap.height > 0) {
        console.log('Valid image');
    } else {
        console.log('Invalid image');
    }
}).catch (function (err) {
    console.log(err);
});
Run Code Online (Sandbox Code Playgroud)