我正在构建一个非常简单的端点来更改用户的个人资料照片,但无法找到有关如何验证上传文件是否为真实图像的详细信息。在服务器上,我可以根据Content-Type
标头轻松过滤掉我的终端请求;如果标题不是我正在执行的类型之一,则返回400.考虑到我只想接收png,jpg或jpeg的图像;我的端点有一个如下所示的条件:
const validImageMimeTypes = ['image/jpeg', 'image/jpg', 'image/png']
router.put('/:id/avatar', (req, res) => {
if (!validImageMimeTypes.includes(req.get('content-type'))) {
res.status(400)
res.send("Unsupported file type")
return
}
...
}
这很好,但它不会阻止用户将文件的扩展名更改为强制文件的扩展名并上传它。我尝试用我的Github头像图片做到这一点,他们的服务器端能够了解我上传的内容不是真实的图像:
{"message":"Expected formats \"png,jpg,gif\", got \"unknown\"",
"request_id":"F5F0:365D:1EC5D9:226D70:5C94E2AB",
"errors":[{"resource":"upload","code":"content_mismatch","field":"format"}]}
一般而言,他们是如何实现此验证的?他们是否使用库从图像中获取简单属性(如大小和宽度),如果失败则返回400?我应该注意哪些行业实践?
谢谢
我找到了一个JavaScript package来完全按照我的需要做。它是主动维护的,适用于我需要检查的文件类型。