如何使multer将影像保存到磁盘?

时间:2020-10-28 23:05:59

标签: reactjs mongodb express multer

因此,我一直试图使multer将图像数据保存在磁盘上,以及图像的模仿类型,名称和指向Mongo磁盘上文件夹的路径。我现在所看到的像这样:

恶意设置:

const storage = multer.diskStorage({
    destination: (req, file, cb) => cb(null, '/public/images/uploads'),
    filename: (req, file, cb) => {
        cb(null, Date.now() + '-' + file.originalname)
    },
});

const upload = multer({
    storage,
    fileFilter (req, file, cb) {
        if (!file.originalname.match(/\.(jpeg\jpg\png)$/)) {
            cb(new Error('Only upload jpg and png files.'));
        }

        cb(undefined, true);
    }
});

上传图片的路径:

router.post('/upload/:userid', upload.single('photo'), uploadPhoto);

然后从控制器中将此位保存在Mongo上的图像详细信息:

const newPhoto = new Photo({
    photo: {
        mimetype,
        photoUrl: `images/uploads/${name}`,
        name,
    },
});

axios调用“上载”端点:

await axios.post(
                `${baseUrl}/api/photo/upload/${JSON.parse(localStorage.getItem('loggedUser'))._id}`,
                formData,
                { headers: {
                    'Content-Type': 'multipart/form-data'
                }},
            ).then(response => setPhotoUrls([response.data.photoUrl, ...photoUrls]));

因此后端部分可以正常工作,因为它可以将所需的数据保存在Mongo上,但是图像仍不会保存在磁盘上。如何使multer将所选图像保存在磁盘上?

1 个答案:

答案 0 :(得分:0)

为类似multerHelper.js的multer创建单独的文件夹

const multer = require('multer');
let fs = require('fs-extra');

let storage = multer.diskStorage({
destination: function (req, file, cb) {
    fs.mkdirsSync(__dirname + '/uploads/images'); // fs.mkdirsSync will create folders if it does not exist
    cb(null, __dirname + '/uploads/images');
},
filename: function (req, file, cb) {
   console.log(file);

    cb(null, Date.now() + '-' + file.originalname);
 }
})

let upload = multer({ storage: storage });

let createUserImage = upload.single('photo');

let multerHelper = {
    createUserImage,
}

module.exports = multerHelper;

在您的路线中导入multerhelper文件

const multerHelper = require("../helpers/multer_helper");

router.post('/upload/:userid',multerHelper, uploadPhoto);