使用 Element 上传组件读取文件

17 篇文章 0 订阅
6 篇文章 0 订阅

需求:支持 .txt 和 .sql 后缀文件内容的读取,最大 2MB。显示已读取文件名称、读取进度和读取成功状态。读取按钮重复点击时,已读取文件列表中的文件被新的文件替换。

<template>
  <el-upload
    ref="upload-sql"
    action=''
    accept=".txt,.sql"
    :auto-upload="false"
    :on-change="changeFile"
    :http-request="uploadHandler">
      <el-button class="mr-2" plain slot="trigger" size="small">
        <i class="el-icon-upload mr-1 font-size-14"></i>读取文件
    </el-button>支持 .txt 和 .sql 后缀文件上传,最大2MB
  </el-upload>
</template>

<script>
  export default {
    data () {
      return {
        sqlText: ''
      }
    },
    methods: {
      getRandomNum (min, max) {
        return Math.floor(Math.random() * (max - min + 1) + min)
      },
      changeFile (file, fileList) {
        if (file.status === 'ready') {
          // 已上传文件列表如果存在 2 条记录,移除第一条,实现替换效果
          if (fileList.length === 2) {
            fileList.shift()
          }
          
          // 手动开始上传
          this.$refs['upload-sql'].submit()
        }
      },
      uploadHandler (params) {
        const isLt2M = params.file.size / 1024 / 1024 <= 2
        if (!isLt2M) {
          this.$notify({
            message: '上传的文件不能大于2MB',
            type: 'warning',
            title: '警告'
          })
          return
        }
        
        // 调用 element ui 进度条
        params.onProgress({ percent: this.getRandomNum(19, 99) })
        setTimeout(() => {
          this.readText(params)
        }, 100)
      },
      async readText (params) {
        // UTF-8,GBK,GB2312
        const readFile = new FileReader()
        readFile.onload = (e) => {
          this.sqlText = e.target.result
          
          params.onProgress({ percent: 100 }) // 调用 element ui 进度条
          params.onSuccess() // 调用 element ui 上传成功方法
        }
        readFile.readAsText(params.file)
      },
    }
  }
</script>

<style scoped lang="scss">
  
  // 去掉已上传文件列表的文件移除动画
  /deep/ .el-list-leave-active {
    transition: none;
  }
  /deep/ .el-list-leave-active {
    opacity: 0;
  }
  /deep/ .el-upload-list {
    max-height: 26px;
  }
</style>

效果:
上传进度条

上传成功

在Vue中使用Element UI上传Excel文件通常是通过`el-upload`组件配合FileReader API来完成的。下面是一个简单的步骤描述: 1. 引入所需库:首先需要在项目中安装Element UI以及相关的依赖,如axios用于发送HTTP请求。 ```bash npm install element-ui axios ``` 2. 配置`el-upload`组件:在HTML模板中,创建一个`<el-upload>`元素,并设置一些属性,例如接受文件类型、最大大小等。同时,可以配置一个action(通常是一个API接收文件的地方),以及处理上传过程的方法。 ```html <el-upload class="upload-demo" action="/api/upload-excel" accept=".xlsx,.xls" max-size="5MB" :on-change="handleChange" :before-upload="beforeUpload" > <i class="el-icon-upload"></i> <div class="el-upload__text">点击上传</div> </el-upload> ``` 3. 定义处理函数:在Vue实例中定义`handleChange`和`beforeUpload`方法。`handleChange`会在用户选择文件后触发,而`beforeUpload`则可以在上传前做一些验证或操作,比如读取文件内容预览。 ```javascript data() { return { file: null, }; }, methods: { handleChange(file) { this.file = file; }, beforeUpload(file) { // 判断是否是excel文件 const isExcel = /\.xls(\?.*)?|\.xlsx(\?.*)?$/.test(file.name); if (!isExcel) { this.$message.error('只支持上传Excel文件'); return false; // 返回false取消上传 } return true; // 返回true允许上传 }, uploadFile() { if (this.file) { axios.post(this.action, { file: this.file }, { onUploadProgress: event => { console.log(`百分比:${Math.round((event.loaded / event.total) * 100)}%`); }, }).then(response => { console.log(response.data); // 处理上传成功后的数据 }) .catch(error => { console.error('上传错误', error); }); } }, }, ``` 4. 用户交互:你可以提供一个“开始上传”按钮或事件监听器,在用户点击时调用`uploadFile`方法。 注意:这个例子假设服务器端能够解析并处理上传的Excel文件,实际开发时还要考虑后端接口的支持和文件解析的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值