ZipUncompressStreamError: invalid comment length

问题遇到的现象和发生背景
遇到的现象和发生背景,请写出第一个错误信息
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
运行结果及详细报错内容
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”


//地图资源更新
app.post('/fileUpload', (req, res, next) => {
    let isSendSuccess = false;
    let buffers = [];
    req.on('data', (trunk) => {
        //console.info("trunk.length:"+trunk.length);
        buffers.push(trunk);
        //console.info("trunk:"+trunk);
    }).on('end', async () => {
        console.log("fileUpload 上传完成");
        res.end(JSON.stringify({
            "code": 200,
            "msg": "upload success"
        }));
        isSendSuccess = true;
        const buffer = Buffer.concat(buffers);
        fs.writeFileSync('satellite.zip', buffer);

使用udpload上传文件时,在存为.zip文件后,使用compressing.zip.uncompress报错:ZipUncompressStreamError: invalid comment length. expected: 46. found: 0;但是用鼠标可以解压。

【以下回答由 GPT 生成】

首先, 让我们来理解一下错误信息。错误信息中提到了一个"invalid comment length"的错误。这通常是由于压缩文件中的注释字段长度不正确导致的。根据错误信息, 预期的注释字段长度应为46,但实际上长度为0。这可能是由于上传的.zip文件中没有包含注释或者注释长度的问题导致的。

针对该问题, 我们可以做以下的解决方案:

  1. 验证上传的.zip文件是否损坏或者非法。我们可以使用adm-zip这样的库来进行操作,该库支持解压损坏的.zip文件。

  2. 对上传文件的代码进行优化,确保正确地接收到完整的.zip文件内容。

根据你提供的代码,我们可以发现有一个问题,就是你在处理文件上传时使用的是req.on('data', ...)方法,这可能会导致文件内容被分片传输,并且我们无法保证收到的数据是完整的。因此,我们应该使用formidable, multer, busboy等库来处理文件上传,这些库可以帮助我们正确地接收文件并确保完整性。

下面是一个使用formidable库的示例代码:

const formidable = require('formidable');
// ...

app.post('/fileUpload', (req, res, next) => {
  const form = formidable({multiples: true});

  form.parse(req, (err, fields, files) => {
    if (err) {
      console.log(err);
      res.statusCode = 400;
      res.send({ error: 'Failed to parse uploaded file' });
      return;
    }

    const file = files['upload'];

    // 检查文件是不是zip文件
    if (file.type !== 'application/zip') {
      console.log('Invalid file type. Only zip files are allowed.');
      res.statusCode = 400;
      res.send({ error: 'Invalid file type. Only zip files are allowed.' });
      return;
    }

    // 将文件保存为satellite.zip
    fs.renameSync(file.path, 'satellite.zip');

    // 继续处理解压逻辑
    // ...

    res.statusCode = 200;
    res.send({ message: 'File uploaded successfully.' });
  });
});

使用formidable库可以确保正确地接收到完整的.zip文件,从而避免了注释长度错误等问题。

注意:我们可以在解压缩逻辑中继续使用compressing库,如果仍然出现错误,可能需要考虑文件的有效性或者使用其他的库进行解压缩操作。

希望以上解决方案对你有所帮助。如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^