JSZip前端上传压缩包,将压缩包里面的文件上传给后端

本文介绍如何使用el-upload组件结合JSZip库在前端处理上传的压缩包,解压后读取其中的图片,通过iconv-lite解决中文乱码问题,并将图片转换为Blob对象存储在数组中,最后以FormData形式提交给后端。
摘要由CSDN通过智能技术生成

需求

使用el-upload上传压缩包,用代码实现解压,之后把里面的图片传给后端保存
在这里插入图片描述

JSZIP

JSZip是一个用于创建、读取和编辑.zip文件的javascript库

安装

npm install jszip  或者 "jszip": "^3.10.1",

导入

<script>
import JSZip from 'jszip'
</script>

实例化

const zip = new JSZip();

el-upload版本

<el-upload
        class="upload-demo"
        action=""
        :http-request="uploadFile"
        :before-upload="handleBefore"  //最主要加入这个函数,下面是说明
        :on-change="handleChange"
        :file-list="fileList">
        <el-button size="small" type="primary">点击上传</el-button>
        <div slot="tip" class="el-upload__tip">上传数据模板.xlsx</div>
      </el-upload>

在这里插入图片描述

获取内部文件集合并将每个文件转成一定格式

handleBefore(file) {
	const zip = new JSZip();
        zip.loadAsync(file)
        .then(f=>{
          console.log('内部文件',f)
          for(let name in f.files){
             zip
            .file(name)
            .async("blob")
            .then(content=>{
              console.log('content',content)  //这里的content其实拿到的是文件内容的字节流
              globalFormDatas.append('files',content)
            })
          }
        }) 
}

在这里插入图片描述

中文乱码问题

npm i iconv-lite -S
let iconv = require('iconv-lite');
      zip.loadAsync(file,{
        decodeFileName: function (bytes) {
          return iconv.decode(bytes, 'gbk');
        }
      })

在这里插入图片描述

读取多级目录的文件并传给后端

用数组保存每一个file文件

handleBefore(file){
      const zip = new JSZip();
      let iconv = require('iconv-lite');
      zip.loadAsync(file,{
        decodeFileName: function (bytes) {
          return iconv.decode(bytes, 'gbk');
        }
      })
      .then(f=>{
        console.log('内部文件',f)
        this.formDatas = new FormData()
        for(let name in f.files){
          if(!f.files[name].dir){
          console.log('name',name,f.files)
            zip.file(name).async("blob").then(content=>{
              console.log('content',content,file)
              this.blobArr.push(new File([content], name, {type: content.type})) //用数组保存每一个file文件
              // this.formDatas.append('files',new File([blobArr], name, {type: content.type}))
              
            })
          }
        }
      }) 
    },

手动提交给后端

     let FormDatas = new FormData();
     this.blobArr.forEach(item=>{
       FormDatas.append('files',item)
      })
     apiName(FormDatas)
     .then(res => {
     })
     .catch(err => {this.loading = false});
JavaScript前端开发中,使用JSZip库可以帮助你方便地生成ZIP压缩包并提供下载功能。JSZip是一个轻量级的JavaScript库,用于操作JavaScript字节流,非常适合处理文件压缩。 首先,你需要安装`jszip`库,可以使用npm(Node Package Manager)或者直接在HTML通过CDN引入: ```html <!-- 使用CDN --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.17.0/jszip.min.js"></script> ``` 然后,你可以按照以下步骤操作: 1. **创建一个新的JSZip实例**: ```javascript const jsZip = new JSZip(); ``` 2. **添加需要压缩的文件到zip**: ```javascript const fileContent = '你的文件内容'; // 或者从input[type=file]读取 const fileName = 'yourFile.txt'; jsZip.file(fileName, fileContent); ``` 3. **将多个文件添加到zip**: ```javascript jsZip.file('file1.txt', 'content1'); jsZip.file('file2.jpg', fs.readFileSync('path/to/image.jpg')); // 如果是本地文件,需要fs模块 ``` 4. **生成并转换为Blob对象以便下载**: ```javascript let zipData = jsZip.generate({ type: 'blob' }); ``` 5. **创建下载链接**: ```javascript const downloadLink = document.createElement('a'); downloadLink.href = URL.createObjectURL(zipData); downloadLink.download = 'archive.zip'; downloadLink.click(); // 触发点击事件,开始下载 ``` 请注意,上述代码示例假设你已经有一个文件系统环境(例如在服务器端),如果没有,则需要使用其他方式处理非静态文件的读取。此外,在实际项目中,你可能会选择更安全的方式来触发下载,比如异步操作或者避免直接模拟用户点击。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值