jszip实现多层目录多文件压缩成zip上传到服务器或下载功能

参考链接

http://docs.asprain.cn/jszip/jszip.html#jszip_file_data
https://www.5axxw.com/questions/simple/ymoww2

功能实现

1,安装依赖

npm install jszip
npm install file-saver

2,页面代码

<FormItem
 v-for="(item, index) in currentResultReviewCatalogs.stageChild"
  :key="index"
  :label="item.childName"
  :label-width="170">
  <div
    v-for="(item2, index2) in item.catalogs"
    :key="index2">
    <span>{{ item2 }}</span>
    <div
      @click="getCurrentFolder(item.childName,item2)">
      <Upload
        :before-upload="handleUpload"
        action="//jsonplaceholder.typicode.com/posts/"
        multiple
      >
        <Button icon="ios-cloud-upload-outline">点击上传文件</Button>
      </Upload>
      <div
        v-for="(fileStage, index3) in uplodaFileList"
        :key="index3">
        <div v-if="fileStage.path === item.childName+'-'+item2">
          <div
            v-for="(file, index4) in fileStage.file"
            :key="index4">
            {{ file.name }}
          </div>
        </div>
      </div>
    </div>
  </div>
</FormItem>

而this.currentResultReviewCatalogs.stageChild的值是配置出来的(目录层级)

<resultReviewItem>
  <stages>
      <stagename>不动产预售、竣工验收和不动产登记</stagename>
      <stageChild>
        <childName>不动产预测</childName>
        <catalogs>成果数据归档</catalogs>
        <catalogs>空间数据归档</catalogs>
        <catalogs>其他数据归档</catalogs>
      </stageChild>
      <stageChild>
        <childName>规划条件核实测量</childName>
        <catalogs>成果数据归档</catalogs>
        <catalogs>空间数据归档</catalogs>
        <catalogs>其他数据归档</catalogs>
      </stageChild>
      <stageChild>
        <childName>土地核验测量</childName>
        <catalogs>成果数据归档</catalogs>
        <catalogs>空间数据归档</catalogs>
        <catalogs>其他数据归档</catalogs>
      </stageChild>
      <stageChild>
        <childName>人防核实测量</childName>
        <catalogs>成果数据归档</catalogs>
        <catalogs>空间数据归档</catalogs>
        <catalogs>其他数据归档</catalogs>
      </stageChild>
      <stageChild>
        <childName>建设工程配套绿地测量</childName>
        <catalogs>成果数据归档</catalogs>
        <catalogs>空间数据归档</catalogs>
        <catalogs>其他数据归档</catalogs>
      </stageChild>
      <stageChild>
        <childName>地下管线工程核实测量</childName>
        <catalogs>成果数据归档</catalogs>
        <catalogs>空间数据归档</catalogs>
        <catalogs>其他数据归档</catalogs>
      </stageChild>
      <stageChild>
        <childName>不动产实测</childName>
        <catalogs>成果数据归档</catalogs>
        <catalogs>空间数据归档</catalogs>
        <catalogs>其他数据归档</catalogs>
      </stageChild>
    </stages>
 </resultReviewItem>

页面效果
在这里插入图片描述

3,文件上传处理处理

handleUpload(file){
      let listHasFileFolder = this.uplodaFileList.find(item=> item.path ===  this.currentDoubleFolderName);
      if (this.uplodaFileList.length === 0 || !listHasFileFolder) {
        this.uplodaFileList.push({
          path:this.currentDoubleFolderName,
          file:[file]
        });
      }else{
        this.uplodaFileList.find(item=> item.path ===  this.currentDoubleFolderName).file.push(file);
      }
      //返回false阻止上传
      return false;
    },

将上传的文件按照一级目录 + ‘-’ + 二级目录的形式存在list中
在这里插入图片描述

4,文件压缩处理

const jszip = new JSZip();
 this.uplodaFileList.forEach(item => {
   //根据path创建两级目录
   let folderArr = item.path.split('-');
   let tempfolder = hasFolder ? jszip.folder(this.work.catalogname).folder(folderArr[0]).folder(folderArr[1]) : jszip.folder(this.work.projectno).folder(this.work.catalogname).folder(folderArr[0]).folder(folderArr[1]);
   if (item.file.length > 0) {
     item.file.forEach(file => {
       tempfolder.file(file.name,file,{binary:true});
     });
   }
 });
 jszip.generateAsync({ type: 'blob' }).then(function (content) {
   FileSaver.saveAs(content, 'test_shinoda.zip');
 });

如需表单提交到服务端

this.uplodaFileList.forEach(item => {
 //根据path创建两级目录
  let folderArr = item.path.split('-');
  let tempfolder = hasFolder ? jszip.folder(this.work.catalogname).folder(folderArr[0]).folder(folderArr[1]) : jszip.folder(this.work.projectno).folder(this.work.catalogname).folder(folderArr[0]).folder(folderArr[1]);
  if (item.file.length > 0) {
    item.file.forEach(file => {
      tempfolder.file(file.name,file,{binary:true});
    });
  }
});
let reviewid = this.scid;
let workTemp = this.work;
jszip.generateAsync({ type: 'blob' }).then(function (content) {
  let catalogid = hasFolder ? result.data.data[0].id : '';
  let pFolderName = hasFolder ? workTemp.catalogname : workTemp.projectno;
  let regioncode = sessionStorage.getItem('district') ;
  let blob = new File([content], pFolderName+'.zip');
  // 空的formData实例对象
  let formData = new FormData();
  // 给formData添加数据
  formData.set('file',blob);
  formData.set('reviewid',reviewid);
  formData.set('catalogid',catalogid);
  formData.set('regioncode',regioncode);
  //文件上传
  axios({
    method: 'post',
    url: appConfig.app.serviceHost + '/onemap-plan/planresult/review/file/uploadfile',
    headers: {
      'Content-Type': 'multipart/form-data',
    },
    data: formData,
  }).then(data => {
    console.log('data', data);
  })
  .catch(error => {
    console.log('data', error);
  });
});

文件压缩过后效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要安装PyQt5模块,可以通过以下命令进行安装: ``` pip install PyQt5 ``` 接下来,我们可以使用Qt Designer工具来设计多层界面,例如设计一个主窗口和一个添加文件的子窗口。可以通过以下命令启动Qt Designer: ``` designer ``` 在Qt Designer中,我们可以通过拖拽和放置控件来设计界面,并且可以设置控件的属性和布局。 设计完成后,我们可以将.ui文件转换为.py文件,可以通过以下命令进行转换: ``` pyuic5 input.ui -o output.py ``` 其中,input.ui为设计好的界面文件,output.py为转换后的Python代码文件。 在Python代码中,我们可以通过以下方式加载设计好的界面: ```python from PyQt5.QtWidgets import QApplication, QMainWindow from output import Ui_MainWindow class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super(MainWindow, self).__init__() self.setupUi(self) self.add_file_button.clicked.connect(self.add_file) def add_file(self): # 添加文件功能代码 ``` 其中,Ui_MainWindow是由Qt Designer生成的类,继承自QMainWindow,可以通过调用setupUi方法来加载设计好的界面。 在上述代码中,我们还实现了一个添加文件功能,可以通过连接add_file_button的clicked信号来实现。在add_file方法中,我们可以编写相应的添加文件逻辑。 总结起来,利用Python和PyQt5实现多层界面设计并实现相应添加文件功能的步骤如下: 1. 安装PyQt5模块; 2. 使用Qt Designer工具设计多层界面; 3. 将.ui文件转换为.py文件; 4. 在Python代码中加载设计好的界面,并实现相应功能

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值