【问题标题】:Multer File Upload Not Working in FirefoxMulter 文件上传在 Firefox 中不起作用
【发布时间】:2019-08-04 03:20:38
【问题描述】:

Multer 将上传的文件添加到 req.file 或 req.files。我的代码在 Chrome 中按预期工作,但 req.file 和 req.files 在 Firefox (68.01) 和 Edge (44.17763.1.0) 中都是空的。

为什么请求对象不包含 Firefox 和 Edge 中的文件?

我的 multer 配置:

const path = require('path');
const uuidv4 = require('uuid/v4');
const multer = require('multer');
const projectRoot = require('./projectRoot');


// Allowed audio mime types
const audioMimeTypeToExt = {
    'audio/wav': '.wav',
    'audio/mp3': '.mp3',
};

// Allowed image mime types
const imageMimeTypeToExt = {
    'image/jpeg': '.jpg',
    'image/png': '.png'
};

// Storage options
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, path.join(projectRoot.path, '/public/tracks/'))
    },
    filename: function (req, file, cb) {
        if (file) {
            // New file name is uuid + extension (i.e. '10ba038e-48da-487b-96e8-8d3b99b6d18a.mp3')
            cb(null, uuidv4() + audioMimeTypeToExt[file.mimetype])
        } else {
            console.log('File missing.');
        }
    }
});


// Filter options
const filter = function (req, file, cb) {
    if (!(file.mimetype.toLowerCase() in audioMimeTypeToExt)) {
        // Reject upload
        cb(null, false);
    }
    // Accept upload
    cb(null, true);
};

const uploadMiddleware = (req, res, next) => {
    multer(
        {
            storage: storage,
            fileFilter: filter,
            limits: {fileSize: 50000000} //50mb
        }
    ).array('tracks', 10)(req, res, function (err) {
        if (err && err.code === "LIMIT_FILE_SIZE") {
            return res.status(413).send(err.message);
        }
        next();
    });
};

module.exports = {
    audioMimeTypeToExt,
    imageMimeTypeToExt,
    uploadMiddleware: uploadMiddleware,
};

我的路线

const express = require('express');
const router = express.Router();
const sessionMiddleware = require('../middlewares/sessionMiddleware');
const {uploadMiddleware} = require('../config/multerConfig');
const uploadController = require('../controllers/uploadController');

router.post('/',
    sessionMiddleware.requiredLogin,
    uploadMiddleware,
    uploadController.upload_post
);

module.exports = router;

我的控制器

const {processUploads} = require('../utilities/uploadsProcessor');

exports.upload_post = async function (req, res, next) {
    if (req.files && req.files.length) { // req.files empty in Firefox and Edge
        await processUploads(req);
        console.log('Upload successful.');
        res.status(200).end();
    }
    else {
        res.status(404).end();
    }

};

谢谢

【问题讨论】:

    标签: file firefox upload multer


    【解决方案1】:

    弄清楚出了什么问题。 Firefox 和 Edge 在 file.mimetype 字段中有不同的值。对于 MP3 文件,Chrome 添加了“audio/mp3”,而 Firefox 和 Edge 添加了“audio/mpeg”。所以我的过滤器过滤了不包含“audio/mp3”或“audio/wav”mimetypes的文件。

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      相关资源
      最近更新 更多