【前端】上传和下载zip文件,有进度条(el-progess)

文章目录

场景:要上传一个zip,调用接口,然后下载一个zip。调用接口的接口响应要显示在进度条中。

上传

上传用的是input原生控件,在页面中隐藏。accept="application/zip"限制只能上传zip。

点击button实现上传,调用input原生组件的方法。

html 复制代码
<el-button
   type="primary"
   size="large"
   @click="uploadSrt"
   >上传srt</el-button
>
<input
   ref="srtInput"
   type="file"
   style="display: none"
   accept="application/zip"
   @change="handleUploadSrt"
 />

在event中拿到上传的文件file。

注意 ,要使用formData和'Content-Type': 'multipart/form-data',以支持二进制的传输。

不能用application/json的响应头,File对象不能被序列化为JSON。

详情看注释。

javascript 复制代码
uploadSrt() {
    this.$refs.srtInput.click()
},
// input原生控件的上传事件,file是拿到的文件
handleUploadSrt(event) {
    const file = event.target.files[0]
    this.upload(file)
},

upload(file) {
    // 用FormData,支持二进制数据传输
    let formData = new FormData()
    formData.append('file', file)

    axios
        .post('url', formData, {
        headers: {
            'Content-Type': 'multipart/form-data',
        },
        //   进度条进度
        onDownloadProgress: (progressEvent) => {
            if (progressEvent.total > 0) {
                this.srtProgress = Math.round((progressEvent.loaded * 100) / progressEvent.total)
            } else {
                this.srtProgress = 100 // 防止progressEvent.total为0出现无限大
            }
        },
        timeout: 10000, // 设置超时时间,若接口在10s内没响应就抛出异常,在catch中捕获
    })
        .then((response) => {
        // 响应后的逻辑
    })
        .catch((error) => {
        // 异常的逻辑
    })
},

下载

请求某个接口下载文件。

请求要设置参数,表示是二进制文件:responseType: 'blob'

创建一个url和a标签,点击a标签则下载。

javascript 复制代码
download(type) {
   let url = 'url'
   axios
     .get(url, { responseType: 'blob', timeout: 10000 })
     .then((res) => {
       const fileName='' // 设置下载的文件名
       // 创建一个下载url和a标签
       const downloadUrl = window.URL.createObjectURL(new Blob([res.data])) // res.data 是要下载的文件
       const link = document.createElement('a')
       link.href = downloadUrl
       // 设置download属性,点击链接就能下载
       link.setAttribute('download', `${fileName}`)
       // 将a标签加在文档中,点击下载
       document.body.appendChild(link)
       link.click()        
     })
     .catch((error) => {
       // ...
     })
 },

进度条

用ElementPlus的组件el-progress,传入一个srtProgress即可。不过效果是一下就闪到100了(可能是接口响应很快??)。

html 复制代码
<el-progress
  :percentage="srtProgress"
  status="warning"
  :stroke-width="12"
/>

最后改为,不要设置超时。给接口多一点时间,有道理!

相关推荐
他们叫我秃子21 小时前
前端开发转 Go 全栈(五):终于遇到熟人了,Go 的闭包和高阶函数原来这么像 JavaScript
前端·后端·go
用户615958680002221 小时前
从 0 写一个迷你 wujie:用原生 Web API 实现微前端
前端
妙码生花21 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十七):AI时代对组件封装的新理解、agInput 统一入口,动态表单预备
前端·后端·go
fairyly21 小时前
接手新项目不用硬啃源码,我的 TRAE Work 快速上手实战工作流
前端·ai编程·trae
搬砖记录员21 小时前
用 PyAutoGUI 手搓录屏"老板键":从原理到四套可跑源码,附工程化落地思考
前端
windliang21 小时前
Claude Code 源码分析(七):Skill 如何进入 Agent
前端·人工智能·面试
栀鸢ouo21 小时前
《Vue 3 实现多主题切换和自定义主题》
前端
缓冲中请稍后21 小时前
React Router 完全指南:从 HashRouter 到 BrowserRouter
前端·面试
妙码生花21 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十六):附件管理、增加根据文件后缀生成 SVG 文件图标的接口
前端·后端·go
栀鸢ouo21 小时前
useTableHeight:一个优雅的 Vue 3 表格自适应高度解决方案
前端