Vue 使用el-upload上传文件与表单一起提交、解析二进制文件获取Excel数据json格式

4 篇文章 0 订阅
1 篇文章 0 订阅

一、安装依赖

npm install xlsx
import * as XLSX from 'xlsx'

二、代码

1、部分代码

<el-row>
  <el-form-item prop="file" label-width="0" style="position: relative;">
    <el-upload
      ref="upload"
      action=""                     // 自定义上传需要将action为空或者"#"
      :limit="1"                    // 限定上传文件数量
      :on-exceed="handleExceed"     // 文件数量超过限定数量时触发
      :auto-upload="false"          // 选取完文件后是否立即进行上传    false关闭      
      :multiple="false"             // 是否支持多选文件
      :on-change="uploadFile"
      :on-remove="handleRemove"     // 删除文件时触发
      accept=".xls"                 // 限制文件格式
    >
         <el-button type="primary">导入数据</el-button>
    </el-upload>
  </el-form-item>
</el-row>
<el-row type="flex" justify="end">
  <el-form-item>
     <el-button v-preventReClick type="primary" @click="submit()">提交</el-button>
  </el-form-item>
</el-row>

2、js代码

uploadFile(param) {
      this.form.file = param.raw // .raw才是真实文件,给form表单
      const reader = new FileReader()
      reader.readAsBinaryString(param.raw) // 以二进制的方式读取
      reader.onload = (e) => {
        const fileString = e.target.result // 读取文件内容
        // 对文件内容进行处理
        const workbook = XLSX.read(fileString, { type: 'binary' }) // 解析二进制格式数据
        const worksheet = workbook.Sheets[workbook.SheetNames[0]] // 获取第一个Sheet
        const result = XLSX.utils.sheet_to_json(worksheet) // json数据格式
        console.log('最终数据格式', result) // 控制台打印数据
        // 对数据进行处理……
      }
    },
handleExceed() {
   this.$message.warning('文件数量超过限制')
},
submit() {
   this.$refs.form.validate((valid) => {
      if (valid) {
          const formDatas = new FormData()
          for (const d in this.form) { // 序列化数据为json添加到表单对象
            if (this.form[d]) {
              formDatas.append(d, this.form[d])
            }
          }
          // 将数据随请求发过去
          this.add(formDatas)
       }
   })
}

3、接口部分

添加:'Content-Type': 'multipart/form-data'

add(formDatas) {
    return request({
      contentType: false,
      headers: { 'Content-Type': 'multipart/form-data'},
      method: 'post',
      url: '/',
      data: formDatas,
    })   
},

三、完后效果

1、接口参数部分

 2、解析二进制文件,最终数据格式

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用以下方法: 1. 安装crypto-js库: ``` npm install crypto-js ``` 2. 引入crypto-js库: ```javascript import CryptoJS from 'crypto-js' ``` 3. 在el-upload组件的before-upload事件中,利用FileReader读取文件内容,然后根据上传的chunk大小进行分块计算文件的sha256: ```html <el-upload class="upload-demo" ref="upload" :action="uploadUrl" :on-preview="handlePreview" :on-remove="handleRemove" :before-upload="beforeUpload" :on-success="handleSuccess" :on-error="handleError" > <el-button size="small" type="primary">点击上传</el-button> </el-upload> ``` ```javascript beforeUpload(file) { const reader = new FileReader() const chunkSize = 1024 * 1024 // 分块大小为1MB const chunks = Math.ceil(file.size / chunkSize) const sha256List = [] const _this = this reader.onload = function() { const sha256 = CryptoJS.SHA256(CryptoJS.lib.WordArray.create(this.result)) sha256List.push(sha256) if (sha256List.length === chunks) { const fileSha256 = CryptoJS.SHA256(CryptoJS.lib.WordArray.create(sha256List.reduce((prev, curr) => { return prev.concat(curr) }, []))) console.log(fileSha256.toString()) // 将文件sha256保存到formData中 const formData = new FormData() formData.append('file', file) formData.append('sha256', fileSha256.toString()) // 调用上传接口 _this.$refs.upload.submit(formData) } else { readNext() } } function readNext() { const start = sha256List.length * chunkSize const end = Math.min(file.size, start + chunkSize) reader.readAsArrayBuffer(file.slice(start, end)) } readNext() // 返回false,阻止文件上传 return false } ``` 以上代码中,利用FileReader读取文件内容,然后根据上传的chunk大小进行分块计算文件的sha256,将计算出的sha256保存到数组中。当所有分块的sha256计算完成后,再将所有分块的sha256合并计算出文件的sha256,并将文件的sha256保存到formData中。最后调用上传接口上传文件和sha256。 注意:在调用上传接口时,需要使用ref属性获取el-upload组件的实例,然后调用submit方法上传文件和sha256。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tahn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值