需求: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  // 开始上传时显示进度

}
        
相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95275 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大5 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师5 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学5 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端