使用Multer将多个文件动态上传到单个目录中吗?

时间:2020-06-30 00:02:52

标签: javascript node.js multer

在使用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 个答案:

答案 0 :(得分:0)

我找到了一种方法,可以使用 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:我使用的是快速路由器,但想法是一样的。