Node.js提取上传Zip文件后无法读取内部文件问题求助
问题描述
我搭建了一个Express服务器,用Multer实现Zip文件上传功能。发起POST请求时,想完成Zip文件解压并读取里面的文件数据返回,但现在服务器只能成功解压Zip,却读不到里面的文件。试过把解压操作放到异步函数里,还是没解决问题。相关代码如下:
app.post('/', upload.single("dataFile"), function (req, res) { const unZipped=new AdmZip(foldername+"/"+req.file.filename)//targeting the uploaded zip file unZipped.extractAllTo(foldername)//extracting the file var followersArray = []; var followingArray = []; const jsonString = fs.readFileSync("uploads/"+foldername+"/followers_and_following/followers_1.json", "utf-8") //reading the extracted files var array = JSON.parse(jsonString); for (var i = 0; i < array.length; i++) { followersArray.push(array[i].string_list_data[0].value) } const jsonString2 = fs.readFileSync("uploads/"+foldername+"/followers_and_following/following.json", "utf-8"); var followingObj = JSON.parse(jsonString2); for (var j = 0; j < followingObj.relationships_following.length; j++) { followingArray.push(followingObj.relationships_following[j].string_list_data[0].value) } followingArray = followingArray.filter(val => !followersArray.includes(val)); res.send(followingArray) })
解决办法
问题根源
- 路径拼接混乱:直接用字符串拼接路径容易出错,
foldername和uploads/的组合可能导致实际文件路径与预期不符。 - 无错误捕获机制:未添加try-catch逻辑,文件读取失败或路径错误时无法定位具体问题。
- 潜在写入延迟:虽然
extractAllTo是同步方法,但大Zip文件解压后,系统可能存在磁盘写入延迟,此时读取文件会失败。
修正后的代码
const fs = require('fs'); const path = require('path'); // 用path模块规范路径,避免拼接错误 app.post('/', upload.single("dataFile"), function (req, res) { try { // 生成正确的Zip文件路径 const zipFilePath = path.join(foldername, req.file.filename); const unZipped = new AdmZip(zipFilePath); // 执行解压,第二个参数设为true允许覆盖已存在文件 unZipped.extractAllTo(foldername, true); let followersArray = []; let followingArray = []; // 规范读取文件的路径 const followersPath = path.join("uploads", foldername, "followers_and_following", "followers_1.json"); // 先检查文件是否存在,避免读取不存在的文件报错 if (!fs.existsSync(followersPath)) { throw new Error("找不到followers_1.json文件"); } const jsonString = fs.readFileSync(followersPath, "utf-8"); const followersData = JSON.parse(jsonString); followersData.forEach(item => { followersArray.push(item.string_list_data[0].value); }); const followingPath = path.join("uploads", foldername, "followers_and_following", "following.json"); if (!fs.existsSync(followingPath)) { throw new Error("找不到following.json文件"); } const jsonString2 = fs.readFileSync(followingPath, "utf-8"); const followingData = JSON.parse(jsonString2); followingData.relationships_following.forEach(item => { followingArray.push(item.string_list_data[0].value); }); // 筛选出仅关注未被关注的列表 const result = followingArray.filter(val => !followersArray.includes(val)); res.send(result); } catch (err) { // 返回错误信息便于排查 res.status(500).send({ error: err.message }); } })
额外优化点
- 异步处理大文件:如果经常处理大Zip文件,建议用AdmZip的异步解压方法
extractAllToAsync,配合fs.readFile异步读取,避免阻塞服务器:
unZipped.extractAllToAsync(foldername, true, (err) => { if (err) { return res.status(500).send({ error: err.message }); } // 解压完成后再执行文件读取 fs.readFile(followersPath, "utf-8", (err, data) => { if (err) { return res.status(500).send({ error: err.message }); } // 后续数据处理逻辑 }); });
- 清理临时文件:请求处理完成后,删除上传的Zip文件和解压后的文件夹,避免磁盘空间浪费。
- 验证上传文件:添加文件格式校验,确保上传的是Zip文件,比如检查
req.file.mimetype是否为application/zip或application/x-zip-compressed。
内容的提问来源于stack exchange,提问作者MASHUKUR RAHMAN
相关产品推荐
相关产品推荐

