vue中预览zip的实现示例

 更新时间:2023年09月14日 08:58:35   作者:reembarkation  
打包压缩成zip的东西,再解压,很麻烦,本文主要介绍了vue中预览zip的实现示例,具有一定的参考价值,感兴趣的可以了解一下

zip的数据流从后端接口获取为blob形式,使用插件jszip, 提取出zip中的目录并绑定到a-tree中。

同时根据压缩包中文件的类型来修改tree中的icon,并修改样式使显示更加清晰。

1. 添加jszip插件:

yarn add jszip

(我一般都使用yarn添加,添加的时候很稳定快速,很少出问题)

2. 由于我的项目中只是某个页面使用到该功能,所以使用局部引用:

在使用该功能的页面引入:

import JSZip from 'jszip'

3. 页面设计,我使用了a-tree来展示,主要用到了treeData数据:

格式如下:

const treeData = [
   {
     title: "root",
     key: "",
     scopedSlots: { icon: "folder" },
     children: [
      {
        title: "folder1",
        key: "0-1",
        id:"0-1",
        parentId:"",
        scopedSlots: { icon: "folder" },
        children: [
          { title: "1.txt", key: "0-1-1", parentId:"0-1",scopedSlots: { icon: "txt" } },
          { title: "3.png", key: "0-1-2", parentId:"0-1",scopedSlots: { icon: "png" } },
          { title: "2.xml", key: "0-1-3", parentId:"0-1", scopedSlots: { icon: "xml" } },
        ],
      },
      {
        title: "folder2",
        key: "0-2",
        id:"0-2",
        parentId:"",
        scopedSlots: { icon: "folder" },
        children: [
          { title: "7.xlsx", key: "0-2-1", parentId:"0-2",scopedSlots: { icon: "childEdit" } },
        ],
      },
      {
        title: "6.pdf",
        key: "0-3",
        id:"0-3",
        parentId:"",
        scopedSlots: { icon: "pdf" },
      },
  ],
 },
];

a--tree的html如下:

<a-tree
                  showIcon
                  :default-expanded-keys="expandedKeys"
                  :expandedKeys="expandedKeys"
                  :selectedKeys="selectedKeys"
                  :treeData="treeData"
                  @expand="onExpand"
                  @select="onSelect"
                >
                <a-icon slot="folder" class="folder" type="folder" />
                <a-icon slot="image" class="image" type="file-image" />
                <a-icon slot="audio" class="audio" type="audio" />
                <a-icon slot="video" class="video" type="video-camera" />
                <a-icon slot="docx" class="docx" type="file-word" />
                <a-icon slot="xml" class="xml" type="file-excel" />
                <a-icon slot="pdf" class="pdf" type="file-pdf" />
                <a-icon slot="zip" class="zip" type="file-zip" />
                <a-icon slot="txt" class="txt" type="file-text" />
              </a-tree>

其中样式如下,可以自己任意修改:

#ziptree .anticon{
  font-size: 20px; color: #08c
}
#ziptree .anticon.folder{
   color: #e7c146
}
#ziptree .anticon.docx{
   color: #2a0ae2
}
#ziptree .anticon.pdf{
   color: #e90b1e
}
#ziptree .anticon.xml{
   color: #047449
}
#ziptree .anticon.zip{
   color: #435892
}
#ziptree .anticon.txt{
   color: #b9c6e7
}
#ziptree .anticon.image{
   color: #82c0a8
}

4. 通过接口获取数据并处理数据:

 downloadAttachmentStream(option).then((res)=>{        
                        if (!res && res.status!=200 && res.data.type == "application/json") {
                            this.$message.error('找不到该文件')
                            return
                        }
                        let jszip = new JSZip()
                        jszip.loadAsync(res.data).then(zip=>{
                          let myData=[]
                          that.transformData(zip, myData,0,)
                          that.treeData=myData
                          that.$nextTick(()=>{
                            that.expandedKeys=['0']
                          })
                        })
                    });

其中transformData方法如下:

  transformData(obj, myData, level = 0) {
      let id=0
      if(Object.keys(obj.files).length==0){
        let fname=this.fileName.substring(0, this.fileName.lastIndexOf("."))
        let rootData={id:'0',parentId:'', key:'0',title:fname, fullName:fname+'/' ,type:'dir', children:[],slots:{ icon: "folder" }}
        myData.push(rootData)
      }else{
      for (let key in obj.files) {
        let array=key.split('/').filter(item => item != '')
        if(array.length == level+1){
          if (obj.files[key].dir) { 
            if(level==0){ // 根 只有一个
              let rootData={id:'0',parentId:'', key:'0',title:array[level], fullName:key ,type:'dir', children:[],slots:{ icon: "folder" }}
              myData.push(rootData)
              this.transformData(obj, rootData,level+1)
            }else{
              // 非根目录
              if(key.indexOf(myData.fullName)===0 && key!= myData.fullName && array.length == level+1){
              let newData={id:myData.id+'-'+id, key:myData.id+'-'+id,parentId:myData.id, title:array[level], type:'dir', children:[],fullName:key,slots:{ icon: "folder" }}
              myData.children.push(newData)
              id++
              this.transformData(obj, newData,level+1)
              }
            }
          }else{ // 文件
           if(key.indexOf(myData.fullName)==0 && key!=myData.fullName){
            let data= {id:myData.id+'-'+id,parentId:myData.id, key:myData.id+'-'+id,title:array[level], type:array[level].replace(/.+\./, ""),fullName:key,}
             if(['jpg','png','gif'].includes(data.type)){
              data.slots={icon: "image"}
             }else if(data.type=='mp3'){
               data.slots={icon: 'audio'}
             }else if(data.type=='mp4'){
               data.slots={icon: 'video'}
             } else if(data.type=='xlsx'){
               data.slots={icon: 'xml'}
             } else{
              data.slots={icon: data.type}
             }
             myData.children.push(data)
             id++
           }
          }
        }else{
          //
        }
      }
      } 
      return myData;
    },

经过以上步骤就能实现一个很漂亮的压缩包的目录树了。

到此这篇关于vue中预览zip的实现示例的文章就介绍到这了,更多相关vue预览zip内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue指令 v-bind的使用和注意需要注意的点

    vue指令 v-bind的使用和注意需要注意的点

    这篇文章主要给大家分享了 v-bind的使用和注意需要注意的点,下面文章围绕 v-bind指令的相关资料展开内容且附上详细代码 需要的小伙伴可以参考一下,希望对大家有所帮助
    2021-11-11
  • Vue3获取响应式数据的四种方法

    Vue3获取响应式数据的四种方法

    Vue 3 引入了一个全新的响应式系统,其中最核心的就是 reactive 和 ref,它们是实现响应式数据的基础,用于创建可以自动跟踪变化并更新视图的对象和变量,本文介绍了Vue3获取响应式数据的四种方法,需要的朋友可以参考下
    2024-08-08
  • 关于element的表单组件整理笔记

    关于element的表单组件整理笔记

    这篇文章主要给大家介绍了关于element的表单组件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • vue-cli3.X快速创建项目的方法步骤

    vue-cli3.X快速创建项目的方法步骤

    这篇文章主要介绍了vue-cli3.X快速创建项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • vue实现两列水平时间轴的示例代码

    vue实现两列水平时间轴的示例代码

    本文主要介绍了vue实现两列水平时间轴的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Vue3+TypeScript实现Docx/Excel预览组件

    Vue3+TypeScript实现Docx/Excel预览组件

    这篇文章主要为大家详细介绍了如何使用Vue3+TypeScript实现Docx/Excel预览组件,文中的示例代码讲解详细,有需要的小伙伴可以参考下
    2024-04-04
  • 如何构建 vue-ssr 项目的方法步骤

    如何构建 vue-ssr 项目的方法步骤

    这篇文章主要介绍了如何构建 vue-ssr 项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • vue项目中如何将当前页面生成图片

    vue项目中如何将当前页面生成图片

    这篇文章主要介绍了vue项目中如何将当前页面生成图片问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue2 模版指令元素绑定事件执行顺序解析

    Vue2 模版指令元素绑定事件执行顺序解析

    这篇文章主要为大家介绍了Vue2 模版指令元素绑定事件执行顺序解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • VUE零基础入门axios的使用

    VUE零基础入门axios的使用

    这篇文章主要介绍了axios在Vue项目中用来向后台发送请求(调接口API),获取响应信息的方法,axios 是一个轻量的 HTTP客户端,基于 XMLHttpRequest 服务来执行 HTTP 请求,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论