前端解压rar文件-node-unrar-js

文章介绍了如何在前端使用node-unrar-js库来解压RAR压缩包,并将解压后的文件转换为树形结构。开发者展示了getRARMetadata方法获取RAR文件元数据和buildRarTree方法构建目录结构的详细代码示例。
摘要由CSDN通过智能技术生成

问题 : 前端需要解压 rar 压缩包并生成 tree 的数据格式

解决办法 : 使用 node-unrar-js 插件,具体步骤如下

  • 安装包 npm i node-unrar-js@2.0.0
  • 引入 import { createExtractorFromData, UnrarError } from 'node-unrar-js';
  • 解压 rar 代码演示:
methods: {
	getRARMetadata(file) {
      	return new Promise((resolve, reject) => {
        	const reader = new FileReader()
        	var fileList = [];
        	reader.onload = async () => {
          	const data = reader.result;
         	const wasmBinary = await (
            await fetch(`../unrar.wasm`, { credentials: 'same-origin' })
          	).arrayBuffer();
          	const extractor = await createExtractorFromData({ wasmBinary, data });
          	const { arcHeader, fileHeaders } = extractor.getFileList();
          	for (const fileHeader of fileHeaders) {
            	fileList.push(fileHeader)
          	}
          	resolve(fileList)
        };

        reader.onerror = error => {
          reject(error);
        };
        reader.readAsArrayBuffer(file);
      });
    },
}

注: getRARMetadata(file) 参数 file 为上传文件之后获取的 file.raw; unrar.wasm 为一个二进制文件,下载地址
运行结果:

在这里插入图片描述

  • 将结果处理成 tree 型结构,代码演示:
    buildRarTree(treeData) {
      const tree = []
      let filterTreeData = treeData.reverse()
      filterTreeData.reverse().forEach((path, i) => {
        const segments = path.name.split('/')
        let currentNode = tree;
        segments.forEach((segment, index) => {
          const isLastSegment = index === segments.length - 1
          const isDir = path.flags.directory

          if (segment !== '') {
            // Filter out nodes with empty labels
            let existingNode = currentNode.find(node => node.label === segment)
            let size = 0
            if (!existingNode) {
              const filePath = path.name.slice(0,path.name.lastIndexOf('/'))
              const newNode = {
                uploadFilePath:  `${i}${index}` == '00' ? segment : isLastSegment ? path.name : filePath,
                label: segment,
                size: isLastSegment ? path.unpSize : 0,
                id: i + '' + index,
                data: path.time,
                dir: isLastSegment ? isDir : true,
                type: 2,
                forUUIDPath: this.offlineImportParams.url,
                md5: h_md5(`${path.unpSize}${path.name}${path.crc}${path.time}`),
              }

              if (isLastSegment) {
                newNode.label = segment
              } else {
                newNode.children = []
              }

              currentNode.push(newNode)
              existingNode = newNode
            }

            currentNode = existingNode.children
          }
        })
      })
      return tree
    },

注: treeData为getRARMetadata函数处理之后的结果
运行结果:
在这里插入图片描述

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值