3

我正在使用插件fileFilter选项multer来决定是否应将图像保存到服务器上。

在该fileFilter功能中,我想检查magic bytes这些图像以确保它们是真实图像且格式正确。Multer仅公开上传图像文件json array文件,如下所示。但我需要实际的图像文件来检查magic bytes

{ fieldname: 'file',
  originalname: 'arsenal-home-kit.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg' }

我在下面的代码中评论了我的详细问题。我的尝试如下;

var storage = multer.diskStorage({
    destination: __dirname + '/../public/images/',
    filename: function (req, file, cb) {
        console.log(file.originalname);
        crypto.pseudoRandomBytes(16, function (err, raw) {
            if (err) return cb(err);

            cb(null, raw.toString('hex') + path.extname(file.originalname))
        })
    }
});
var upload = multer({
    storage: storage,
    fileFilter: function (req, theFile, cb) {
            // using image-type plugin to check magic bytes
            // I need actual image file right at here.
            // theFile is json array, not the image file.
            // How to I get the actual image file to check magic bytes.
            if (imageType(theFile).ext === "jpg") {
                // To accept the file pass `true`, like so:
                cb(null, true);
            } else {
                // To reject this file pass `false`, like so:
                cb(null, false);
            }
        }
    });

PS 我决定使用图像类型插件来检查这些魔术字节。

4

1 回答 1

2

fileFilter 在开始文件上传之前调用,因此它无法访问文件数据。 正如您在路线图中看到的那样,这是类似的请求https://github.com/expressjs/multer/issues/155 。

目前您可以将文件下载到临时目录,然后对其进行验证并移动到目标目录或删除。

在我的应用程序中,我使用两种类型的验证器:第一种是在上传之前(非常有限),第二种是在上传之后(mime 检查可以在之后)。

于 2015-09-16T15:44:55.877 回答