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

}
        
相关推荐
用户69371750013849 小时前
Google 正在“收紧侧加载”:陌生 APK 安装或需等待 24 小时
android·前端
蓝帆傲亦9 小时前
Web 前端搜索文字高亮实现方法汇总
前端
用户69371750013849 小时前
Room 3.0:这次不是升级,是重来
android·前端·google
漫随流水10 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
踩着两条虫12 小时前
VTJ.PRO 核心架构全公开!从设计稿到代码,揭秘AI智能体如何“听懂人话”
前端·vue.js·ai编程
jzlhll12313 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin
蓝冰凌13 小时前
Vue 3 中 defineExpose 的行为【defineExpose暴露ref变量】详解:自动解包、响应性与实际使用
前端·javascript·vue.js
奔跑的呱呱牛14 小时前
generate-route-vue基于文件系统的 Vue Router 动态路由生成工具
前端·javascript·vue.js
柳杉14 小时前
从动漫水面到赛博飞船:这位开发者的Three.js作品太惊艳了
前端·javascript·数据可视化