3

fileFilterプラグインのオプションを使用してmulter、画像をサーバーに保存するかどうかを決定しています。

その関数では、これらの画像をチェックして、それらが実際の画像であり、正しい形式であることをfileFilter確認したいと考えています。以下のように、アップロードされた画像ファイルのファイルのみを公開します。しかし、確認するには実際の画像ファイルが必要です。magic bytesMulterjson arraymagic 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と同様のリクエストです。

現在、ファイルを一時ディレクトリにダウンロードして検証し、目的のディレクトリに移動するか、削除することができます。

私のアプリケーションでは、2 種類のバリデーターを使用しています。1 つはアップロード前 (非常に限定的) で、もう 1 つはアップロード後のタイプ (Mime チェックは後でもかまいません)。

于 2015-09-16T15:44:55.877 に答える