Vue加element Ui 实现下载文件和进度条展示。

<template>
    <el-progress :percentage="percentage"></el-progress>
    <h1>{title}</h1>
    <el-button :disabled="isDisabled" @click="getProgress">下载文件</el-button>
</template>
<script>
  export default {
    data(){
        return {
            title:"请点击按钮进行下载。",
            percentage:0, //进度条的占比
            isDisabled:false,  //默认可以点击
        }
    },
    methods: {
      getProgress(){
        //进度条恢复为 0 
        this.percentage= 0;
        //按钮置灰 不可点击
        this.isDisabled= true;
        //发起请求
        this.$axios({
            //下载文件的远端地址。
            url:"https://文件地址.html",  
            //请求方式 get post。   
            method:"get",  
            //设置返回数据类型为base64的数据,这样才可以被new Blob() 解析。    
            responseType:"blob",
            //请求参数 get-->params   post-->data 。
            params:{},
            //xml返回数据的钩子函数,可以用来获取数据的进度 具体可查看axios的官网
            onDownloadProgress:(progressEvent)=>{
                //progressEvent.loaded 下载文件的当前大小
                //progressEvent.total  下载文件的总大小 如果后端没有返回 请让他加上!
                let progressBar = Math.round( progressEvent.loaded / progressEvent.total*100);
                //接收进度为99%的时候需要留一点前端编译的时间
                if(progressBar >= 99){
                    this.percentage = 99;
                    this.title = '下载完成,文件正在编译。';
                }else{
                    this.percentage = progressBar;
                    this.title = '正在下载,请稍等。';
                }
            } 
         }).then( res =>{
            //当前定义res.message 出现的时候说明后端文件返回出现了问题 不然应该直接是个文件流 
            if(res.message){
                this.title = '下载失败'
                this.isDisabled= false
                return
            }
            //blob返回的是一个 base64 格式的文件流
            let blob = new Blob([res],{
                //编译文件为xlsx类型。 具体可查看 blob 方法定义的类型 
               type:"application/vnd.ms-excel"  
            })
            //编译文件
            if(window.navigator && window.navigator.meSaveOrOpenBlob){
                window.navigator.meSaveOrOpenBlob(blob,"文件名称.xlsx")
            }else{
                let Url= window.URL.createObjectURL(blob);
                let link= document.createElemnet("a");

                link.style.display = "none";
                link.href = Url;
                link.setAttribute("download","文件名称.xlsx");
                document.body.appendChild(link);
                link.click();
            }
            //编译文件完成后,进度条展示为100%100
            this.percentage =100;
            //下载完成 可以重新点击按钮下载
            this.isDisabled= false;
        })
       }
    },
  };
</script>

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用 Element UI 中的上传组件,可以轻松地添文件上传进度条。以下是一个简单的示例: 首先,在 Vue 组件中导入 Element UI 和 axios: ```javascript import { Upload, Progress } from 'element-ui'; import axios from 'axios'; ``` 然后,在模板中添上传组件和进度条组件: ```html <template> <div> <upload :action="uploadUrl" :on-success="handleSuccess" :on-progress="handleProgress" :show-file-list="false" :before-upload="beforeUpload" > <el-button>上传文件</el-button> </upload> <progress :value="progress" max="100">{{ progress }}%</progress> </div> </template> ``` 在组件的 data 属性中添 uploadUrl、progress 变量: ```javascript data() { return { uploadUrl: '/api/upload', progress: 0, }; }, ``` 在 methods 中添上传成功回调函数 handleSuccess 和上传进度回调函数 handleProgress: ```javascript methods: { handleSuccess(res, file) { console.log('上传成功', res, file); }, handleProgress(event, file, fileList) { this.progress = parseInt(event.percent, 10); }, beforeUpload(file) { const formData = new FormData(); formData.append('file', file); axios.post('/api/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', }, onUploadProgress: (progressEvent) => { this.progress = parseInt( Math.round((progressEvent.loaded * 100) / progressEvent.total) ); }, }); return false; }, }, ``` 在 beforeUpload 方法中使用 axios 发送文件上传请求,并监听 onUploadProgress 事件更新进度条。 需要注意的是,上传组件的 show-file-list 属性设置为 false,即不显示已上传的文件列表,如果需要显示,可以设置为 true。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值