Vue怎么解压7z类型的压缩包

各位知道Vue怎么解压7z的压缩包吗?读取本地的7zip类型的文件并解压

该回答引用ChatGPT

由于 JavaScript 和 Vue 是前端技术,它们没有解压的能力,所以需要通过服务端代码进行解压。

首先,使用前端的文件选择器获取到本地的 7z 压缩包文件,然后使用 FormData 对象上传该文件到服务器端

以下是前端代码示例:

<template>
  <div>
    <input type="file" @change="uploadFile"/>
  </div>
</template>

<script>
export default {
  methods: {
    uploadFile(event) {
      const input = event.target;
      const file = input.files[0];
      const formData = new FormData();
      formData.append('file', file);
      axios.post('/server/unzip', formData).then(response => {
        console.log(response);
      });
    }
  }
};
</script>


然后是服务端代码:

// 假设使用 PHP 作为服务端语言

$file = $_FILES['file'];
$path = './' . $file['name'];
move_uploaded_file($file['tmp_name'], $path);

// 解压代码
$zip = new \ZipArchive;
$res = $zip->open($path);
if ($res === TRUE) {
  $zip->extractTo('./');
  $zip->close();
  echo '解压成功';
} else {
  echo '解压失败';
}


yauzl 这个库吧:

const yauzl = require("yauzl");
const fs = require("fs");

// 定义7z文件路径
const filePath = "./test.7z";

// 打开7z文件
yauzl.open(filePath, {lazyEntries: true}, function(err, zipfile) {
  if (err) throw err;
  zipfile.readEntry();
  zipfile.on("entry", function(entry) {
    // 获取压缩包中的文件名
    var fileName = entry.fileName;
    // 如果是目录,读取下一个条目
    if (/\/$/.test(fileName)) {
      zipfile.readEntry();
    } else {
      // 如果是文件,解压到指定目录
      zipfile.openReadStream(entry, function(err, readStream) {
        if (err) throw err;
        readStream.pipe(fs.createWriteStream(fileName));
        readStream.on("end", function() {
          zipfile.readEntry();
        });
      });
    }
  });
});

根据您描述的问题,希望使用vue添加本地的zip文件,并进行解析。这里提供以下解决方法:
1.如果你需要在前端解压,可以使用jszip库或者pako库进行解压。
2.考虑到你不需要input标签来让用户点击输入这个操作来选择要解压的文件,那么可以建议你把input这个标签加个hidden隐藏属性,当用户需要选择zip文件时,可以通过js自动出发input的点击事件,从而弹出让用户选择文件的选择框,这样一来,又能实现文件路径的选择,又能实现不让用户看到这个input

Vue.js 本身不提供解压 7z 压缩包的功能,因为 JavaScript 是客户端语言,不能执行文件系统的操作。

如果您想在 Vue.js 应用中实现解压 7z 压缩包的功能,您可以使用 JavaScript 库,如 js-7zip。您可以在 Vue.js 应用中通过 npm 安装该库:

npm install js-7zip

接着,您可以在 Vue.js 组件中通过以下代码实现解压 7z 压缩包:

<template>
  <div>
    <input type="file" ref="fileInput" @change="decompress"/>
  </div>
</template>

<script>
import 7z from 'js-7zip';

export default {
  methods: {
    async decompress() {
      const file = this.$refs.fileInput.files[0];
      const decompressed = await 7z.decompress(file);
      console.log(decompressed);
    }
  }
};
</script>

这样,当用户选择文件时,该文件将被解压,并在控制台中打印解压后的内容。

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。
参考代码:


const fs = require('fs');
const child = require('child_process');
const path = require('path');

/**
 *  记录正在下载的文件
 * @shopMsg 渲染进程回传当前需要下载的文件信息
 * @electronWindow 当前渲染进程的窗口参数
 */

function decompression(shopMsg, electronWindow) {
    return new Promise((resolve) => {
        //判断下载文件属于那个类型(创建对应的文件夹名称)
        let FileType = '';
        if (shopMsg.resourceType == 'role_model') {
            FileType = 'avatar';
        } else {
            FileType = 'other';
        }
        //解压文件的目标路径
        const localFilePath = path.join(__dirname, '../resources/Bundles/' + shopMsg.resourceCode + '/' + shopMsg.resourceCode + '.zip');
        //想要解压完成之后保存文件的路径
        const FilePath = path.join(__dirname, '../resources/DownLoad/' + FileType + '/' + shopMsg.resourceCode);
        //安装在项目中的7zip应用文件路径
        const WinRAROath = path.join(__dirname, '../7ZIP/7-Zip/7z.exe');
        if (!fs.existsSync(localFilePath)) {
            resolve('不存在目标解压文件!');
            electronWindow.webContents.send('decompression', 'fail', shopMsg.resourceCode);//渲染进程状态变化的回调
            return;
        }
        if (fs.existsSync(FilePath)) {
            console.log('解压文件已存在');
        } else {
            console.log('创建解压文件夹');
            fs.mkdirSync(FilePath);
            //x:完整路径下解压文件  -y:所有确认选项都默认为是(即不出现确认提示)  -o:设置输出目录
            child.exec(WinRAROath + ' x -y -o' + FilePath + ' ' + localFilePath, (error, stdout, stderr) => {
                if (error) throw error;
                else console.log('解压成功'); electronWindow.webContents.send('decompression', 'success', shopMsg.resourceCode);//渲染进程状态变化的回调
            });
        }
    });
}

module.exports = { decompression };

两个方案
方案一:
在项目中引入JSZip工具以便于调用其接口实现文件的解压,具体需要先在vue-cli生成的项目中运行如下指令安装JSZip:
npm i jszip -S or npm install jszip
安装完成后在node_modules目录下会看到jszip文件夹,此时在script中声明require来引入jszip,或者通过import导入:

var JSZip = require("jszip");或者import JsZip from 'jszip'
在 script 中的methods中添加上传压缩包前的触发事件handleBefore,如下:

handleBefore(file) {
var new_zip = new JSZip();
new_zip.loadAsync(file)
.then(function(file) {
// you now have every files contained in the loaded zip
new_zip.file("testTXT.txt").async("string") // 此处是压缩包中的testTXT.txt文件,以string形式返回其内容,此时已经可以获取zip中的所有文件了
.then(function (content) {
// use content
alert(content)
});
});
}

<template>
  <div>

  </div>
</template>
 
<script>

import pako from 'pako'
export default {
   created(){
       // 引入压缩地址
         axios.get('/server/unzip',{
         responseType:'arraybuffer'
       } ).then(response => {
        console.log(response);
       const data = new Uint8Array(response)
        const unzipped = pako.inflate(data)
        console.log(unzipped)
      }); 
  }
};
</script>
 
 




Vue中使用7zip类型的文件很容易,只需要引入一个package就好。

步骤1:安装7-zip模块
npm install 7zip

步骤2:在代码中调用7-zip
import sevenZip from '7zip';

步骤3:定义保存文件的路径
const savePath = './unzip_folder';

步骤4:定义解压缩函数
const unzipFile = (file, savePath) => {
  sevenZip.unpack(file, savePath);
};

步骤5:调用函数,传递文件和保存路径
const filePath = './sample.7z';
unzipFile(filePath, savePath);

下面来自ChatGPT的回复
Vue 不能直接解压 7z 类型的压缩包,但可以使用第三方库来实现解压的功能。比如:js-7zip。

  1. 首先,安装 js-7zip:
npm install js-7zip --save
  1. 然后,在 Vue 中引入:
import Seven from 'js-7zip'
  1. 最后,实现解压 7z 类型的文件:

```javascript
// 读取本地 7z 文件
var file = // 读取本地 7z 文件

// 解压 7

需要安装npm插件,可以在npm上找找看。
这个p7zip应该比较符合你的要求
使用文档:

Vue没有内置的7zip解压缩功能,但是可以使用第三方库js-7zip来实现。首先,安装js-7zip:

npm install js-7zip

然后,在Vue中引入js-7zip:

import SevenZip from 'js-7zip'

最后,使用以下代码来解压7z文件:

// 读取本地文件
let file = document.getElementById('file').files[0]
let reader = new FileReader()

reader.onload = function (e) {
  // 解压文件
  SevenZip.unpack(e.target.result).then(function (unpacked) {
    console.log(unpacked)
  })
}

reader.readAsArrayBuffer(file)

不支持在前端直接解压 7z 格式的文件,因为前端是不能执行本地命令的。你可以使用后端语言(如 Node.js)进行解压,然后在前端使用 AJAX 进行读取。

你可以安装 Node.js 模块 'adm-zip' ,然后在 Node.js 中使用如下代码读取并解压 7z 格式的文件:

var AdmZip = require('adm-zip');
var zip = new AdmZip('./path/to/your.7z');
var zipEntries = zip.getEntries();
zipEntries.forEach(function(zipEntry) {
    console.log(zipEntry.toString());
});


这样你就可以在后端读取并解压 7z 格式的文件了。

Vue中解压7z文件的一般步骤如下:

1. 安装 JSZip
 yarn add jszip

2. 引入JSZip
import JSZip from 'jszip';

3. 从文件获取数据
let file = e.target.files[0] //获取到文件 
let reader = new FileReader();

reader.readAsArrayBuffer(file); 
reader.onload = (e) => {
    // 将文件转换为ArrayBuffer
    let buffer = e.target.result; 
    // 将ArrayBuffer解压缩
    let zip = new JSZip(); 
    let zipFile = zip.loadAsync(buffer); 
    // 使用Promise处理zipFile
    zipFile.then((data) => {
        // 解压成功后调整数据

4. 处理数据
  // 使用Object.keys方法来获取zip文件里所有文件名,然后使用for..in循环
  let fileNames = Object.keys(data.files);
  for (let name in data.files) {
      let file = data.files[name];
      // 再次使用Promise,使用async/await返回文件内容
      let fileBuffer = await file.async("nodebuffer"); 
      // 最后可以将返回来的文件Buffer处理,根据业务需要
   }
}

以上是Vue中解压7z文件的一般思路,具体的实现过程会根据不同的项目而有所差异。

解压7z压缩包:

  1. 安装 7zip 插件:
    使用 Vue-cli 拉取 7zip 插件,在主文件夹中执行以下命令:
    npm install 7zip --save
  2. 导入插件:
    将 7zip 插件导入 vue 组件中:
    import 7zip from '7zip'
  3. 读取本地 7zip 文件并解压缩:
    使用 readFile 方法从本地的 7zip 文件中读取文件:
    let zipData = 7zip.readFile(filename);
    let destinationPath = path.join(__dirname, 'yourdestinationPath');
    7zip.unzip(zipData, destinationPath);

最后用的libarchive.js框架

import { Archive } from 'libarchive.js/main.js';

readFile(url, fileName){
      Archive.init({
          workerUrl: 'libarchive.js/dist/worker-bundle.js'
      });
      new Promise((resolve, reject) => {
        var blob = null
        var xhr = new XMLHttpRequest()
        xhr.open("GET", url)
        xhr.setRequestHeader("Accept", "")
        xhr.responseType = "blob"
        xhr.onload = async () => {
          blob = xhr.response
          let file = new File([blob], fileName, { type: ''})
          const archive = await Archive.open(file);
          let obj = await archive.getFilesArray();
            
          console.log("压缩包里的文件", obj);
          resolve(file)

        }
        xhr.onerror = (e) => {
          reject(e)
        }
        xhr.send()
      })
    }

this.readFile('https://cdn.jiajutech.com/jiaju/2020/6/24/01cf9073-52ee-4fc1-ba75-a46a6231911e.material', 'files')

img

不好意思,各位的办法都没有借鉴到,没办法采纳了。