nodejs 处理zip文件的上传

最近在上传小游戏的资源压缩包及热更新的时候用到了上传zip的问题,在这里记录一下

nodejs处理zip文件的第三方库有很多,这里我使用的是unzip,可以执行如下命令进行安装:

npm install unzip --save

前端我用的是ejs模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ejs上传文件页面</title>
</head>
<body>
    <h1><%=msg%></h1>
    <form action="/upload" method="POST" enctype="multipart/form-data">
            <!-- application/x-zip-compressed -->
        <input type="file" id="file" name="fileItem" multiple="multiple" value="" accept="application/x-zip-compressed">
        <input type="submit" value="提交">
    </form>
</body>
</html>

中间遇到了很多坑,没有form元素的话传到后端获取不到files,接受表单的第三方库是multer

下面是app.js的 具体实现:

const express = require("express");
const ejs = require("ejs");
const multer = require("multer");
const fs = require("fs");
const uzip = require("unzip");
let upload = multer({
    dest: "upload/"
})
const app = express();
const path = require("path");
app.set("view engine","ejs");
app.use("/remote-assets",express.static(path.join(__dirname + "/public/remote-assets")));
app.get("/upload",(req,res) => {
    ejs.renderFile("./view/upload.ejs",{
        msg: "上传文件"
    },(err,data) => {
        if(err) {
            throw err;
        }
        console.log("data is ",data);
        res.send(data);
    })
    // res.render("content",)
})
app.post("/upload",upload.single("fileItem"),(req,res) => {
    
    // console.log("req is ",req);
    console.log("file is ",req.file);
    let file = req.file;
    let extName = path.extname(file.originalname);
    let n = path.basename(file.originalname).lastIndexOf(".");
    let nstr = file.originalname.substring(0,n);
    let filename = "upload/" + nstr + extName;
    fs.exists(filename,(exists) => {
        if(!exists) {
            return;
        }
        // 删除原来的文件
        fs.unlinkSync(filename);
    })
    // 重命名
    try {
        fs.rename(file.path,filename,() => {
            console.log("重命名成功");
            if(extName === ".zip") {
                // 开始解压
                fs.createReadStream(filename).on("error",() => {
                    console.log("解压失败");
                }).on("close",() => {
                    console.log("关闭");
                    // 删除zip文件
                    fs.unlinkSync(filename);
                }).pipe(uzip.Extract({path: "upload/" + nstr}));
            }
        })
    } catch(e) {
        console.log("e is ",e);
    } finally {

    }
    
    
    
}),
app.listen(8080,() => {
    console.log("a app is runing on port 8080");
});

猜你喜欢

转载自blog.csdn.net/lck8989/article/details/100065288