【问题标题】:Uploading multiple files into single directory dynamically using Multer?使用 Multer 将多个文件动态上传到单个目录?
【发布时间】:2020-06-30 00:02:52
【问题描述】:

有没有办法在多选上传期间使用 multer 将多个文件上传到一个唯一文件夹?

例如,单次上传 = [file1,file2,file3],它们会保存到 dir_1。 目前,我将 [file1,file2,file3] 映射到每个文件的文件夹中。目标只是将上传/发布请求中的每个文件存储在按上传时间标记的目录中。

这是我迄今为止一直在尝试的。但是我的代码为多选的每次上传生成一个唯一的文件夹。无法真正弄清楚我应该在哪里生成这些文件夹。我应该在发布请求中创建文件夹吗?

const storageConfig = multer.diskStorage({
            destination: (req, file, cb) => {
                let path = './storage/' + String(Date.now());
                fs.mkdirSync(path);
                cb(null, path);
            },
            filename: (req, file, cb) => cb(null, Date.now() + path.extname(file.originalname))
        });

var upload = multer({
             storage: storageConfig
 }).array('files')


    app.post('/api/upload', (req, res, next) => {
        upload(req, res, function (err) {
            // Handle errors in post request 
            if (err instanceof multer.MulterError) {
                console.log(String(err).split('\n')[0])
            } else {
                const files = req.files
                console.log("Recieved uploaded file", files)
                return res.json({
                    files: files,
                    
                }
                )
            }
        })
    })

感谢您提供任何指导或提示。

【问题讨论】:

  • 所以目标是根据当前日期创建 1 个目录并将所有图像(来自单个批处理请求)存储到同一个目录中?
  • @user9879287 是的,就是这样

标签: javascript node.js multer


【解决方案1】:

我找到了一种方法,可以使用 formidable 来执行您想要执行的操作。

const formidable = require('formidable');
import { v4 as uuid } from 'uuid'; //Using uuid to create unique folder names

...

router.post('/someRoute', auth, async(re, res, next) =>{
    req.setTimeout(0);
    res.setTimeout(0);

    let uniqueFolderName = uuid().split("-").join("");
    const baseDirectory = path.join(__dirname, `../../uploads/${uniqueFolderName}`);

    if(!fs.existsSync(baseDirectory)){
        fs.mkdirSync(baseDirectory);
    }

    const form = formidable({multiples: true});
    form.on('fileBegin', (name, file)=>{
        file.path = `${baseDirectory}/${file.name}`;
    });
    form.on('file', (name, file)=>{
        console.log('File saved!');
    });

    form.parse(req, async(err, fields, files)=>{
        if(err){
            res.status(500).send("Some error message");
        }

        //Do whatever you want here
        res.status(200).send("Ok");
    });
});

PS:我用的是express router,不过思路是一样的。

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2020-05-31
    • 2021-03-27
    • 1970-01-01
    相关资源
    最近更新 更多