vue + axios实现文件下载

1、导出excel数据

button定义

    <div style="text-align:left">
      <el-button type="primary" v-on:click="exportExcelData()">数据导出</el-button>
    </div>

下载的methods中的方法:
有2种方式:

exportExcelData(){
   
        // 导出excel数据表

        /** 第一种方法 */
        // let tempForm = document.createElement("form");//创建form表单,以下数form表单的各种参数
        // tempForm.id = "tempForm1";
        // tempForm.method = "get";
        // tempForm.action = '/user/exportData';
        // tempForm.target="_";
        // let input = document.createElement("input");
        // tempForm.appendChild(input);
        //
        // if(document.all){
   
        //   tempForm.attachEvent("onsubmit",function(){});//IE
        // }else{
   
        //   var subObj = tempForm.addEventListener("submit",function(){},false);//firefox
        // }
        // document.body.appendChild(tempForm);
        // if(document.all){
   
        //   tempForm.fireEvent("onsubmit");
        // }else{
   
        //   tempForm.dispatchEvent(new Event("submit"));
        // }
        // tempForm.submit();//提交POST请求
        // document.body.removeChild(tempForm);

        /** 第二种方法,浏览器中不会出现新建标签页,但是需要手动获取下载的文件名 */
        const _loading = loading(`数据导出中,请稍后...`)
        const config = {
   
          onDownloadProgress: progressEvent => {
   
            // progressEvent.loaded:已上传文件大小
            // progressEvent.total:被上传文件的总大小
            this.progressPercent = Number((progressEvent.loaded / progressEvent.total * 100).toFixed(0))
            _loading.setText('数据导出中,进度:' + this.progressPercent + "%") //更新dialog进度,优化体验
            console.log(progressEvent)
          },
          responseType:'blob'
        }
        this.$axios.get('/user/exportData', config)
          .then(resp => {
   
            console.log(resp)
            _loading.close()

            let contentDisposition = resp.headers['content-disposition'];
            console.log(contentDisposition)
            let fileName = "上海电气工业APP大赛报名表.xlsx"
            if (contentDisposition) {
   
              fileName = window.decodeURI(resp.headers['content-disposition'].split('=')[1]);
              console.log('获取到的文件名 = ' + fileName)
            }

            let blob = new Blob([resp.data], {
   type: 'application/octet-stream'});
            if (window.navigator.msSaveOrOpenBlob) {
    //支持IE
              navigator.msSaveBlob(blob, fileName);
            } else {
   
              let link = document.createElement('a');
              link.style.display = "none";
              link.href = window.URL.createObjectURL(blob);
              link.download = fileName;
              document.body.appendChild(link);
              link.click();
              //释放内存
              window.URL.revokeObjectURL(link.href);
              document.body.removeChild(link);
            }

            // 提示用户
            // if(resp.status == 200){
   
            //   this.$message({
   
            //     message: "导出完成",
            //     type: 'success'
            //   });
            // } else {
   
            //   this.$message({
   
            //     message: "导出失败",
            //     type: 'error'
            //   });
            // }

          })
          .catch(function (error) {
    // 请求失败处理
            console.log('请求本地接口失败' + error);
          });


      },

吼他springboot接口:

    @Transactional
    @ApiOperation(notes = "报名数据导出", value = "报名数据导出", httpMethod = "GET")
    @GetMapping(value = "/exportData" , produces = "application/json;charset=UTF-8")
    public void exportData(HttpServletResponse response) {
   
        userService.exportData(response);
    }

exportData接口实现:

<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Vue + Axios + El-upload进行文件上传并跨域,需要按照以下步骤进行操作: 1. 在Vue项目中安装axios和element-ui。在命令行中输入以下命令即可安装: ``` npm install axios element-ui --save ``` 2. 在Vue项目中创建一个上传文件的组件,例如FileUpload.vue。在该组件中导入axios和element-ui,并且引入El-upload组件。示例代码如下: ```vue <template> <div> <el-upload class="upload-demo" :action="uploadUrl" :on-success="handleUploadSuccess" :before-upload="beforeUpload" :headers="headers" :data="formData" :file-list="fileList"> <el-button size="small" type="primary">点击上传</el-button> </el-upload> </div> </template> <script> import axios from 'axios' import { Message } from 'element-ui' export default { name: 'FileUpload', data () { return { fileList: [], uploadUrl: 'http://example.com/upload', formData: {}, headers: { 'Content-Type': 'multipart/form-data' } } }, methods: { handleUploadSuccess (response, file, fileList) { // 上传成功后的处理逻辑 console.log(response) }, beforeUpload (file) { // 文件上传前的处理逻辑 console.log(file) } } } </script> ``` 3. 在组件中实现文件上传的逻辑。在上传文件之前,需要设置请求头和请求数据,并且需要处理跨域请求。可以在组件的methods中定义一个upload方法,用来发送上传请求。示例代码如下: ```vue <script> import axios from 'axios' import { Message } from 'element-ui' export default { name: 'FileUpload', data () { return { fileList: [], uploadUrl: 'http://example.com/upload', formData: {}, headers: { 'Content-Type': 'multipart/form-data' } } }, methods: { handleUploadSuccess (response, file, fileList) { // 上传成功后的处理逻辑 console.log(response) }, beforeUpload (file) { // 文件上传前的处理逻辑 console.log(file) }, upload () { let config = { headers: this.headers, withCredentials: true // 跨域请求需要设置withCredentials为true } let data = new FormData() data.append('file', this.fileList[0].raw) // 向后端发送上传请求 axios.post(this.uploadUrl, data, config) .then(response => { this.handleUploadSuccess(response) }) .catch(error => { console.log(error) }) } } } </script> ``` 4. 最后,在Vue组件中使用El-upload组件,并且调用upload方法即可实现文件上传。示例代码如下: ```vue <template> <div> <el-upload class="upload-demo" :action="uploadUrl" :on-success="handleUploadSuccess" :before-upload="beforeUpload" :headers="headers" :data="formData" :file-list="fileList"> <el-button size="small" type="primary" @click="upload">点击上传</el-button> </el-upload> </div> </template> <script> import axios from 'axios' import { Message } from 'element-ui' export default { name: 'FileUpload', data () { return { fileList: [], uploadUrl: 'http://example.com/upload', formData: {}, headers: { 'Content-Type': 'multipart/form-data' } } }, methods: { handleUploadSuccess (response, file, fileList) { // 上传成功后的处理逻辑 console.log(response) }, beforeUpload (file) { // 文件上传前的处理逻辑 console.log(file) }, upload () { let config = { headers: this.headers, withCredentials: true // 跨域请求需要设置withCredentials为true } let data = new FormData() data.append('file', this.fileList[0].raw) // 向后端发送上传请求 axios.post(this.uploadUrl, data, config) .then(response => { this.handleUploadSuccess(response) }) .catch(error => { console.log(error) }) } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值