如何在nodejs中创建一个以用户名命名的目录

How to create a directory that take the name of username in nodejs

我正在使用 nodeJS (express) 进行上传任务,目标是上传一个包含一些 mp4 文件的 zip 文件,我想将 zip 内容提取到一个以用户名命名的目录中 (req.user ) 如果不存在,或者如果存在,我不需要重新创建它,只需将 zip 内容放入其中即可。

可以从技术上解释一下如何做吗,我完成了上传和提取过程,但需要深入了解如何完成这项任务,我的应用程序连接了数千名用户。

upload.js

const util = require("util");
const multer = require("multer");
const maxSize = 10*1024*1024;

let storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, __basedir + "/resources/static/assets/uploads/zip");
    },
    filename: (req, file, cb) => {
        req.zipFilePath = __basedir + "/resources/static/assets/uploads/zip/" + file.originalname
        cb(null, file.originalname);
    },
});

let uploadFile = multer({
    storage: storage,
    limits: {fileSize: maxSize},
}).single("zipFile");

let uploadFileMiddleware = util.promisify(uploadFile);
module.exports = uploadFileMiddleware;

操作控制器

async function upload(req, res) {
    console.log(req.user)
    const account = await getAccount(req.user.id);

    uploadFile(req, res).then(data => {
            fs.createReadStream(req.zipFilePath)
                .pipe(unzipper.Extract({path: __basedir + "/resources/static/assets/unzipped"}))
                .on('close', function (entry) {
                    fs.readdir(__basedir + "/resources/static/assets/unzipped", (err, files) => {
                        fs.unlink(req.zipFilePath, function (e) {
                            if (e) throw e;
                        });
                        return res.status(200).send({
                            message: "Uploaded the file successfully: " + req.file.originalname,
                        });
                    });
                });
        }
    ).catch(err => {
        return res.status(500).send({
            message: `Could not upload the file, ${err.message}`,
        });
    })
}

您可以检查该用户名的目录是否存在,但有一个问题,因为可能有同名的用户。因此,为每个用户使用 uniqueID 并在有新用户时创建一个新目录。

var fs = require('fs');
var dir = `resources/static/assets/unzipped/${req.username}`;

if (!fs.existsSync(dir)){
    fs.mkdirSync(dir); //create new directory and write to it.
}
else {
// write stream to existing dir
}