最近在上传小游戏的资源压缩包及热更新的时候用到了上传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");
});