首页 > 解决方案 > 如何在nodejs中创建一个使用用户名名称的目录

问题描述

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

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

上传.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}`,
        });
    })
}

标签: node.jsapiexpressfile-uploadextract

解决方案


您可以使用该用户名检查目录是否存在,但有一个问题,因为可能存在同名的用户。因此,为每个用户使用 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
}

推荐阅读