当前位置: 首页 > article >正文

前端通过函数方法触发文件上传、限制文件类型、限制文件大小、上传的进度

包含文件列的表格

  <vxe-table
        ref="table"
        border
        :row-config="{ isHover: true }"
        highlight-hover-row
        align="center"
        stripe
        :data="tableAll.data">
        <vxe-column
          type="seq"
          title="序号"
          width="60"
          align="center"></vxe-column>
        <vxe-column
          width="260"
          title="附件类型"
          field="type"
          align="center"></vxe-column>
        <vxe-column
          title="附件名称"
          field="fileName"
          header-align="center"
          align="left">
        <vxe-column
          title="操作"
          width="260"
          align="center">
          <template #default="{ row }">
            <div class="btns">
              <el-tooltip
                content="预览"
                placement="top">
                <i
                  class="icon icon-view"
                  @click="handleFileView(row)"
                  v-if="row.fileName"></i>
              </el-tooltip>
              <el-tooltip
                content="上传"
                placement="top">
                <i
                  class="icon icon-up"
                  @click="handleFileUpload(row)"
                  v-if="!row.fileName"></i>
              </el-tooltip>
              <el-tooltip
                content="下载"
                placement="top">
                <i
                  class="icon icon-down"
                  @click="handleFileDown(row)"
                  v-if="row.fileName"></i>
              </el-tooltip>
              <el-tooltip
                content="删除"
                placement="top">
                <i
                  class="icon icon-del-min"
                  @click="handleFileDel(row)"
                  v-if="row.fileName"></i>
              </el-tooltip>
            </div>
            <el-progress
              v-if="row.type && row.type === currentFileName"
              :percentage="progress"
              :status="progress === 100 ? 'success' : undefined" />
          </template>
        </vxe-column>
      </vxe-table>

限制文件类型、限制文件大小、上传的进度、获取上传进度

 import { ElMessage } from 'element-plus';
 ...
 async handleFileUpload(row) {
      const fileInput = document.createElement('input');
      fileInput.type = 'file';
      // 限制文件类型
      fileInput.accept = '.ppt,.pptx,.xls,.xlsx,.doc,.docx,.pdf,.ceb';
      // 隐藏文件上传标签
      fileInput.style.display = 'none';
      // 将文件上传标签插入到body底部
      document.body.appendChild(fileInput);
      // 触发文件上传
      fileInput.click();
      fileInput.onchange = async (e) => {
        const files = e.target.files;
        if (files.length === 0) {
          // 用户未选择文件或取消了文件选择
          fileInput.remove();
          return;
        }
        const allowedTypes = [
          '.ppt',
          '.pptx',
          '.xls',
          '.xlsx',
          '.doc',
          '.docx',
          '.pdf',
          '.ceb',
        ];
        // 获取文件扩展名
        const fileName = files[0].name;
        const fileExtension = fileName.slice(fileName.lastIndexOf('.'));
        // 检查文件类型是否在允许的类型中
        if (!allowedTypes.includes(fileExtension)) {
          ElMessage.error(
            '文件类型不正确,请选择正确的文件格式(.ppt,.pptx,.xls,.xlsx,.doc,.docx,.pdf,.ceb)'
          );
          fileInput.remove();
          return;
        }
        // 检查文件大小,限制为10MB
        const maxSize = 10 * 1024 * 1024; // 10MB
        if (files[0].size > maxSize) {
          ElMessage.error('文件大小超过限制,请选择10MB以内的文件');
          fileInput.remove();
          return;
        }
        const formData = new FormData();
        formData.append('file', files[0]);
        this.currentFileName = row.type;
        try {
          const res = await http({
            method: 'post',
            url: '/file/upload/single/file',
            data: formData,
            params: {
              type: this.currentFileName,
            },
            onUploadProgress: (progressEvent) => {
              let complete =
                ((progressEvent.loaded / progressEvent.total) * 100) | 0;
              // 这里为上传的进度
              this.progress = complete;
            },
          });
          if (res.data.code === 0) {
            this.$message.success('上传成功!');
          } else {
            this.$message.error(res.data.data);
          }
        } finally {
          this.currentFileName = '';
          this.progress = 0;
          fileInput.remove();
          // 刷新数据列表
          this.initData();
        }
      };
    },

http://www.kler.cn/a/460385.html

相关文章:

  • 刷入super镜像报错 FAILED (remote: ‘Error: Last flash failed : Volume Full‘)
  • JavaScript中如何创建对象
  • 华为配置 之 链路聚合
  • 静默模式下安装Weblogic 14.1.1.0.0
  • “虚拟下单”,虚拟马丁下单,动态计算保本点位 MT4指标 限时免费!
  • 【Unity】 HTFramework框架(五十七)通过Tag、Layer批量搜索物体
  • 仿快团团商品详情页底部按钮头像轮播(uniapp)
  • XQR5VFX130-1CN1752V,,具有高度的可编程性和灵活性的FPGA中文技术资料
  • 摄像头监视脚本
  • Wonder Dynamics技术浅析(一)
  • [算法] [leetcode-1137] 第 N 个泰波那契数
  • 【自动驾驶汽车通讯协议】RGMII通信技术详解
  • 自学记录:鸿蒙5使用ArkTS和ArkUI实现Live View功能
  • 【经管】上市公司供应链风险数据测算数据集+dofile(2008-2023年)
  • gitlab的搭建及使用
  • udp分片报文发送和接收
  • 经典排序算法:冒泡排序与选择排序
  • List排序的方法
  • JVM和异常
  • 【华为OD-E卷 - 机房布局 100分(python、java、c++、js、c)】
  • Edge如何获得纯净的启动界面
  • XIAO Esp32 S3 轻松发送 HTTP 请求,打造智能物联网应用
  • 优化咨询行业团队协作:通过有效的项目管理工具实现高效协作
  • 爬虫代码中如何添加异常处理?
  • torch.nn.Linear(p_input, p_output,bias)
  • 2024Jinger的前端学习内容总结——前端学习路线(超全)