You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
})
解决办法

问题根源

  1. 路径拼接混乱:直接用字符串拼接路径容易出错,foldername和uploads/的组合可能导致实际文件路径与预期不符。
  2. 无错误捕获机制:未添加try-catch逻辑,文件读取失败或路径错误时无法定位具体问题。
  3. 潜在写入延迟:虽然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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:09:30