通过multer上载多个文件

时间:2019-08-17 17:35:33

标签: node.js express multer sharp

在我的nodejs应用程序中通过multer上传两个文件时,我需要帮助。我通过Sharp对其进行处理以调整大小,但它会同时剪切两个文件。 如何分别设置每个文件的设置?

以下代码:

// main upload function
const upload = multer({

    ...
    sharp: (req, file, cb) => {
        const resizer = Sharp()
            .resize(1024, 1024)
            cb(null, resizer)
    }
})

// for uploading some files
let cpUpload = upload.fields([{ name: 'image1', maxCount: 1 }, { name: 'image2', maxCount: 1 }])

// getting files
router.post('/', cpUpload, async (req, res) => { ... })

2 个答案:

答案 0 :(得分:1)

首先,您必须声明multer函数,还可以向该函数添加任何属性。我也提到了一些属性。这是更多信息,link

//uploading images and validations
const upload = multer({
    limits: {
        fileSize: 1000000 //maximum size of an image
    },
    fileFilter(req, file, cb) {
        // checking if file extension does not match with jpg,png,jpeg
        if (!file.originalname.match(/\.(jpg|png|jpeg)$/)) {
            return cb(new Error('Please upload a image.')); // if it is then throw an error
        }
        cb(undefined, true);
    }
});

然后必须用尖角声明路线,基本上尖角是

此高速Node.js模块的典型用例是将 常用格式的大图片,缩小为适合网络使用的JPEG,PNG和 不同尺寸的WebP图像。

这里是link,以获取更多信息。

//create photo
router.post('/',upload.array('pic', 10),async (req, res) => {
        try {
            const promises = req.files.map((file) => {
                return sharp(file.buffer).resize({ width: 1024, 
                                                   height: 1024}).png().toBuffer();
            });

            const buffers = await Promise.all(promises);

            const photos = buffers.map((buffer) => {
                return new Photo({ pic: buffer});
            });

            await Photo.insertMany(photos);

            res.redirect('/');
        } catch (e) {
            res.status(400).redirect('/');
        }
    },
    (error, req, res, next) => {
            res.status(400).redirect('/');
    }
);

答案 1 :(得分:0)

Sharp方法用于调整我们要上传的所有图像的大小,其基本用途是节省存储容量。有两种方法可以实现您想要的。如果要与现有的一起使用,请使用第一个。您可以使用 multer 的过滤器方法,并执行要在特定文件上执行的操作。

const upload = multer({
    fileFilter: function (req, file, cb) {
        yourFunctionToPerformResize(file, cb);
    }
});

第二,您可以使用 MulterResizer 调整想要的特定图像的大小。这是link

const multer = require('multer');
const MulterResizer = require('multer-resizer');
const resizer = new MulterResizer({
    multer: multer({storage: multer.diskStorage({destination: './'})}),
    tasks: [
        {
            resize: {
                width: 1920,
                height: 1080,
                suffix: 'resized-big'
            }
        },
        {
            resize: {
                width: 100,
                height: 100,
                suffix: 'resized-small'
            }
        },
        {
            cover: {
                width: 160,
                height: 112,
                suffix: 'thumbnail'
            }
        }
    ]
});

router.post('/', auth.ensureAuthentication, resizer.single('file'), function(req, res, next) {
    // All multer-resizer tasks were completed
});