需求:el-upload加上文件上传进度

需求: 给el-upload加上文件上传进度

效果:

方式一: 封装的接口

js 复制代码
export function submissionUpload(file: File, config = {}) {
  const formData = new FormData();
  formData.append("file", file);
  formData.append("folder", "submission/temp");
  formData.append("fileType", "all");

  return request({
    url: "/api/submission/upload",
    method: "post",
    data: formData,
    headers: {
      "Content-Type": "multipart/form-data",
    },
    ...config, // ✅ 透传 axios 的额外参数
  });
}

在调用时加上 onUploadProgress

js 复制代码
async function uploadFile(options: UploadRequestOptions): Promise<any> {
  const config = {
    onUploadProgress: (progressEvent: ProgressEvent) => {
      if (progressEvent.total) {
        const percent = Math.round(
          (progressEvent.loaded * 100) / progressEvent.total
        );
        options.onProgress?.({ percent }, options.file); // 通知 el-upload
      }
    },
  };

  if (
    props.type === "submission" ||
    props.type === "review" ||
    props.type === "reviewData" ||
    props.type === "revision"
  ) {
    const { data } = await submissionUpload(options.file, config);
    fileForm.value.name = data.content?.origin;
    fileForm.value.innerId = data.content?.inner;
    fileForm.value.randomCode = Math.random();
    setFile(data);
  } else {
    const { data } = await copyeditUpload(options.file, config);
    fileForm.value.name = data.content?.origin;
    fileForm.value.innerId = data.content?.inner;
    fileForm.value.randomCode = Math.random();
    setFile(data);
  }
}

方式二: 使用axios方式

js 复制代码
async function uploadFile(options: UploadRequestOptions): Promise<any> {
  const formData = new FormData();
  formData.append("file", options.file);
  // formData.append("folder", "submission/temp")
  formData.append("fileType", "all")

  let url = "";
  let folder = "";

  if (
    props.type === "submission" ||
    props.type === "review" ||
    props.type === "reviewData" ||
    props.type === "revision"
  ) {
    url = "/api/submission/upload"; 
    folder = "submission/temp";
  } else {
    url = "/api/copyedit/upload"; 
    folder = "copyedit/temp";
  }


  formData.append("folder", folder);

  try {
    const res = await axios.post(url, formData, {
      headers: {
        "Content-Type": "multipart/form-data",
      },
      // 上传进度回调
      onUploadProgress: (progressEvent) => {
        if (progressEvent.total) {
          const percent = Math.round(
            (progressEvent.loaded * 100) / progressEvent.total
          );
          // 更新进度
          options.onProgress({ percent }, options.file);
        }
      },
    });

    const data = res.data;
    if (data?.code === 2000) {
      fileForm.value.name = data?.data?.content?.origin;
      fileForm.value.innerId = data?.data?.content?.inner;
      fileForm.value.randomCode = Math.random();
      setFile(data.data);

      options.onSuccess(data, options.file);
      showProgress.value = false 
    } else {
      options.onError(res);
      showProgress.value = false 
      ElMessage.error(res.data.message)
    }
  } catch (err: any) {
    options.onError(err);
    showProgress.value = false 
  }
}

界面:

js 复制代码
<el-form-item
          prop="innerId"
          :rules="[
            {
              required: true,
              message: 'Please Upload File',
              trigger: 'change',
            },
          ]"
        >
          <el-row>
            <el-col :span="24">
              <!-- 显示绿色上传成功图标 :show-file-list="false" -->
              <el-upload
                ref="upload"
                :http-request="uploadFile"
                class="upload-demo"
                v-model:file-list="fileList"
                :before-upload="beforeUpload"
                :before-remove="beforeUpload"
              >
                <el-button type="primary">Upload</el-button>

                <template #tip>
                  <div class="el-upload__tip">
                    upload files you would like the editor and/or author to
                    consult, including revised versions of the original review
                    file(s).
                  </div>
                </template>
              </el-upload>

              <div v-if="showProgress" class="upload-progress">
                <div><el-icon><InfoFilled /></el-icon> The file is being uploaded. Please do not close the pop-up box.</div>
              </div>

            </el-col>
          </el-row>
        </el-form-item>
        
        
// 文件上传效果
const showProgress = ref(false)
const beforeUpload = (file) => {
  showProgress.value = true  // 开始上传时显示进度

}
        
相关推荐
码客前端2 分钟前
理解 Flex 布局中的 flex:1 与 min-width: 0 问题
前端·css·css3
Komorebi゛2 分钟前
【CSS】圆锥渐变流光效果边框样式实现
前端·css
工藤学编程15 分钟前
零基础学AI大模型之CoT思维链和ReAct推理行动
前端·人工智能·react.js
徐同保15 分钟前
上传文件,在前端用 pdf.js 提取 上传的pdf文件中的图片
前端·javascript·pdf
怕浪猫16 分钟前
React从入门到出门第四章 组件通讯与全局状态管理
前端·javascript·react.js
欧阳天风23 分钟前
用setTimeout代替setInterval
开发语言·前端·javascript
EndingCoder27 分钟前
箭头函数和 this 绑定
linux·前端·javascript·typescript
郑州光合科技余经理28 分钟前
架构解析:同城本地生活服务o2o平台海外版
大数据·开发语言·前端·人工智能·架构·php·生活
沐墨染30 分钟前
大型数据分析组件前端实践:多维度检索与实时交互设计
前端·elementui·数据挖掘·数据分析·vue·交互
xkxnq33 分钟前
第一阶段:Vue 基础入门(第 11 天)
前端·javascript·vue.js