首页 > 解决方案 > multer以奇怪的格式保存图像

问题描述

我正在尝试从我的 Express 服务器向我的客户端提供图像,但是 multer 以一种奇怪的格式保存文件,这会在我的 react 应用程序尝试渲染图像时导致问题

multer服务器端代码:

const fileFilter = (req, file, cb) => {
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png'){
        // accept a file
        cb(null, true);
    } else {
        // reject a file
        cb(new Error('Incorrect file'), false);
    }
}
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'uploads/');
    },
    filename: (req, file, cb) => {
        cb(null, Date.now() + path.extname(file.originalname))
    }
});

const upload = multer({
    storage: storage,
    limits: {
        fileSize: 1024 * 1024 * 5 // max 5mb for image size
    },
    fileFilter: fileFilter
});

router.post('/', upload.single('productImage'), ProductsController.products_create_product);

这段代码成功地在文件/uploads夹中创建了文件,但是当我将路径保存到数据库时,我得到了这个响应:

邮差

{
    "size": 5,
    "quantityInStock": 11,
    "productImage": "uploads\\2021-03-11T19-18-05.442Zvans-2.jpg",
}

如何更改它以便以这种格式保存图像:/uploads/2021-03-11T19-18-05.442Zvans-2.jpg

标签: node.jsexpressmulter

解决方案


您只需要像这样修复目标路径:

cb(null, path.join(__dirname, './uploads/'));

对我来说,这是完整的代码块。只需抓住你想要的实际部分:

const multer = require('multer');
const path = require('path');

const appConfigs =  require('./../config/app');

module.exports = function (folderName) {
    // TODO: console log here and optimize multiple initialization of multer if need
    return multer({
        storage: multer.diskStorage({
            destination: function (req, file, cb) {
                const filePath = path.join(__dirname, './../uploads/' + folderName);
                cb(null, filePath);
            },
            filename: function (req, file, cb) {
                const extension = file.mimetype.split('/')[1];
                const fileName = (new Date().getTime() / 1000 | 0) + '.' + extension;
                cb(null, fileName);
            }
        }),
        limits: {
            fileSize: 1024 * 1024 * appConfigs.image_max_size // MB
        },
        fileFilter: (req, file, cb) => {
            let valid = (file.mimetype === 'image/jpeg' || file.mimetype === 'image/jpg' || file.mimetype === 'image/png');
            cb(null, valid);
        },
    });
};

推荐阅读