vue如何通过$http的post方法请求下载二进制的Excel文件

这篇具有很好参考价值的文章主要介绍了vue如何通过$http的post方法请求下载二进制的Excel文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

方式一:单独接口,接口封装 特定的service.js

1.下载

//下载
export function getReportTemplate(){
    return new Promise((resolve, reject) => {
        axios({
            method: 'post',
            url: '/fas/engine/web/fund/final/template',
            responseType: "blob",
            headers: {
                'Content-Type': 'application/json;charset=UTF-8',
            },
        }).then((res) => {
            resolve(res)
        }).catch(error => {
            reject(error)
        });
    })
}

使用此function

//下载上报的模板
uploadTemplate(){
    getReportTemplate().then((res) => {
        console.log("getReportTemplate",res);
        var blob = new Blob([res.data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'})
        var downloadElement = document.createElement('a')//创建一个a 虚拟标签
        var href = window.URL.createObjectURL(blob) // 创建下载的链接
        downloadElement.href = href;
        downloadElement.download = "基金预算编报模板"; // 下载后文件名
        document.body.appendChild(downloadElement)
        downloadElement.click() // 点击下载
        document.body.removeChild(downloadElement) // 下载完成移除元素
        window.URL.revokeObjectURL(href) // 释放掉blob对象
    });
},

2.上传

//上传
export function getReport(formData){
    return new Promise((resolve, reject) => {
        axios({
            method: 'post',
            url: '/fas/engine/web/fund/budget/addReport',
            data: formData,
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        }).then((res) => {
            resolve(res)
        }).catch(error => {
            reject(error)
        });
    })
}

使用此function, test.vue

<template>
  <el-dialog :destroy-on-close="true" :close-on-click-modal="false" :title="title" :visible.sync="dialogVisible" @closed="closed">
    <el-upload style="width:100%"
          ref="upload"
          class="upload-demo"
          drag
          accept=".xlsx"
          :limit="limit"
          action=""
          :show-file-list="false"
          :on-change="handleChange"
          :on-remove="handleRemove"
          :http-request="handleUpload"
          :on-exceed="handleExceed"
          :file-list="fileList"
          :before-upload="beforeUpload"
          :auto-upload="false"
          >
          <i class="el-icon-upload" v-show="!uploadFlag"></i>
          <div class="el-upload__text" v-show="!uploadFlag">将文件拖到此处,或<em>点击上传</em></div>
          <div class="el-upload__text" v-show="!uploadFlag">支持格式.xlsx且不超过10MB!</div>
          <div class="my-el-upload__text" v-show="uploadFlag">
            <span class="filename">{{fileName}}</span> {{fileSize}}
              <br/>
              <br/>
            <span class="cx">重选</span>
          </div>
          <div class="el-upload__tip" slot="tip">
            <div>导入说明:</div>
            <div>1.请确定使用最新版本导入数据,否则会提交失败。</div>
            <div>2.请按模板中的约束条件操作,否则会提交失败。</div>
          </div>
        </el-upload>
    <span slot="footer" class="dialog-footer">
      <!-- <el-button size="mini" @click="dialogVisible = false">取消</el-button> -->
      <el-button size="mini" type="primary" @click="submitUpload()">提交</el-button>
    </span>
  </el-dialog>
</template>

<script>
import { Message } from "element-ui";
import {getReport} from '@/services/fumtService/fundRunManage/fundCalFormulationService';
import { formatBytes } from "@/utils/util";
export default {
  name: "fundCalUpload",
  data() {
    return {
      dialogVisible: false,
      editForm:{},
      limit:1,
      uploadFlag:false,
      fileList: [
        // {name: 'food.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}
      ],
      title:'',
      fileName:'',
      fileSize:'',
    };
  },
  methods: {
    beforeUpload(file) {
      // console.log(file);
      // var testmsg = file.name.substring(file.name.lastIndexOf('.')+1);
      // const extension = testmsg === 'xlsx';
      // const isLt10M = file.size / 1024 / 1024 < 10;
      // if(!extension) {
      //   Message.error('上传文件只能是 .xlsx 格式');
      // }
      // if(!isLt10M) {
      //   Message.error('上传文件大小不能超过 10MB!');
      // }
    },
    submitUpload() {
        if(!this.uploadFlag){
            Message.error("请先选择文件!");
        } else{
            this.$refs.upload.submit();
        }
    },
    handleRemove(file, fileList) {
        this.uploadFlag = false
    },
    handleChange(file, fileLists){
      console.log("----------file",file);
      console.log("----------fileLists",fileLists);
        var testmsg = file.name.substring(file.name.lastIndexOf('.')+1);
        const extension = testmsg === 'xlsx';
        const isLt10M = file.size / 1024 / 1024 < 10;
        if(!extension) {
          Message.error('上传文件只能是 .xlsx 格式');
        }
        if(!isLt10M) {
          Message.error('上传文件大小不能超过 10MB!');
        }
        if(extension && isLt10M){
          this.fileName=file.name;
          this.fileSize=formatBytes(file.size,2);
          this.uploadFlag = true;
        }
        return extension && isLt10M;
    },

    handleUpload(file) {
      let formDatas = new FormData();
      formDatas.append("file", file.file);
      formDatas.append("rid", this.editForm.rid);//这"file" 代表参数名
      // formDatas.append("user_id", 18); //把后端需要参数全部用这个形式push进去
      getReport(formDatas).then((res) => {
        Message.success('上报成功');
        this.dialogVisible = false;
      }).catch((err)=>{
        Message.error(err);
      })
      
    },
    handleExceed(files, fileList) {
      this.handleChange(files[0], fileList);
      // this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
      // Message.warning(`当前限制选择 1 个文件!`);
    },
    handleClose: function (done) {
        let self = this
        Bus.$emit("delCurrentTab", "businessQuery/CntrDetail");
    },
    closed(){
      this.uploadFlag=false;
      this.fileList= [];
      this.title='';
    },
    show(data,title) {
      this.title=title;
      this.dialogVisible = true;
      this.editForm = JSON.parse(JSON.stringify(data));
    },
    submitForm(){
      this.$refs.upload.submit();
    }
  },
};
</script>

<style scoped lang="less">
/deep/ .el-form-item__content {
  width: 100%;
}

/deep/ .el-upload{
  width: 100%;
}
/deep/ .el-upload-dragger{
  width: 100%;
}
.my-el-upload__text:focus{
  outline: none!important;
}
.my-el-upload__text{
  // outline: none!important;
  margin-top:50px;
  color:#606255;
  .filename{
    margin-right: 20px;
    color: #303133;
    text-decoration: underline;
  }
  .cx{
    color: #1b65b9;
  }
}

</style>

方式二、封装通用的底层的service.js

重点:

instanceName: "exportExcel",导出excel文件

instanceName: "downloadLog",下载.log后缀的txt文件

// 可声明axios的default配置
export const defaults = defineRequestConfig([
  {
    /**
     * 对参数 `params` 进行序列化
     * axios 默认做参数序列化时会进行encode 导致某些接口中文参数问题,暂时使用外部覆盖方式解决
     */
    paramsSerializer: (params) => {
      return qs.stringify(params, { arrayFormat: 'repeat', encode: false })
    },
    // 多实例配置
    interceptors: {
      request: {
        // 设置请求头信息
        onConfig: (config) => {
          config.headers.Accept = 'application/json'
          config.headers['Content-Type'] = 'application/json'
          config.headers['X-Requested-With'] = 'XMLHttpRequest'
          if (!config.data) config.data = {}
          return config
        }
      },
      response: {
        // 请求失败
        onError: (error) => {
          const { response } = error
          const { data } = response

          // 处理请求错误的返回结果
          const errorObj = {
            status: response?.status,
            statusText: response?.statusText,
            errorCode: data?.errorCode ?? data?.error,
            errorMessage:
              data?.errorMessage ?? data?.message ?? data?.error ?? data
          }

          // 判断登录超时
          if (response && response.status === 401) {
            console.error('登录超时', response)
            const loginUrl = response?.headers?.loginurl || ''

            if (loginUrl) {
              // 跳转登录页
              window.location.href = loginUrl
              return Promise.reject(error)
            } else {
              // 页面刷新
              window.location.reload()
              return Promise.reject(error)
            }
          }

          return Promise.reject(errorObj)
        }
      }
    }
  },
  {
    paramsSerializer: (params) => {
      return qs.stringify(params, { arrayFormat: 'repeat', encode: true })
    },
    instanceName: "test",
    baseURL: '/test',
    interceptors: {
      request: {
        // 设置请求头信息
        onConfig: (config) => {
          config.headers.Accept = 'application/json'
          config.headers['Content-Type'] = 'application/json'
          config.headers['X-Requested-With'] = 'XMLHttpRequest'
          if (!config.data) config.data = {}
          return config
        }
      },
      response: {
        // 请求失败
        onError: (error) => {
          const { response } = error
          const { data } = response

          // 处理请求错误的返回结果
          const errorObj = {
            status: response?.status,
            statusText: response?.statusText,
            errorCode: data?.errorCode ?? data?.error ?? data?.code,
            errorMessage:
              data?.errorMessage ?? data?.message ?? data?.error ?? data
          }

          // 判断登录超时
          if (response && response.status === 401) {
            console.error('登录超时', response)
            const loginUrl = response?.headers?.loginurl || ''

            if (loginUrl) {
              // 跳转登录页
              window.location.href = loginUrl
              return Promise.reject(error)
            } else {
              // 页面刷新
              window.location.reload()
              return Promise.reject(error)
            }
          }
          return Promise.reject(errorObj)
        }
      }
    }
  },
  {
    paramsSerializer: (params) => {
      return qs.stringify(params, { arrayFormat: 'repeat', encode: false })
    },
    instanceName: "exportExcel",
    baseURL: '/test',
    interceptors: {
      request: {
        // 设置请求头信息
        onConfig: (config) => {
          config.headers.Accept = 'application/json'
          config.responseType = "blob"
          config.headers['Content-Type'] = 'application/json;charset=UTF-8'
          config.headers['X-Requested-With'] = 'XMLHttpRequest'
          if (!config.data) config.data = {}
          return config
        }
      },
      response: {
        onResponse: (response) => {
          const { data } = response;
          const str = response?.headers['content-disposition']
          const oldFileName = buildFileName(str)
          const filename = response?.headers['Kyy-Hosp-Dip-Filename']
          response.data = {
            data: data,
            filename: filename ? filename : oldFileName
          }
          return response
        },
        // 请求失败
        onError: (error) => {
          const { response } = error
          const { data } = response

          // 处理请求错误的返回结果
          const errorObj = {
            status: response?.status,
            statusText: response?.statusText,
            errorCode: data?.errorCode ?? data?.error ?? data?.code,
            errorMessage:
              data?.errorMessage ?? data?.message ?? data?.error ?? data
          }

          // 判断登录超时
          if (response && response.status === 401) {
            console.error('登录超时', response)
            const loginUrl = response?.headers?.loginurl || ''

            if (loginUrl) {
              // 跳转登录页
              window.location.href = loginUrl
              return Promise.reject(error)
            } else {
              // 页面刷新
              window.location.reload()
              return Promise.reject(error)
            }
          }
          return Promise.reject(errorObj)
        }
      }
    }
  },
  {
    paramsSerializer: (params) => {
      return qs.stringify(params, { arrayFormat: 'repeat', encode: true })
    },
    instanceName: "downloadLog",
    baseURL: '/test',
    interceptors: {
      request: {
        // 设置请求头信息
        onConfig: (config) => {
          config.headers.Accept = 'application/json'
          config.headers['Content-Type'] = 'application/octet-stream'
          if (!config.data) config.data = {}
          return config
        }
      },
      response: {
        onResponse: (response) => {
          const { data } = response;
          const filename = response?.headers['Kyy-Hosp-Dip-Filename']
          response.data = {
            data: data,
            filename: filename
          }
          return response
        },
        // 请求失败
        onError: (error) => {
          console.log('error', error);
          const { response } = error
          const { data } = response

          // 处理请求错误的返回结果
          const errorObj = {
            status: response?.status,
            statusText: response?.statusText,
            errorCode: data?.errorCode ?? data?.error ?? data?.code,
            errorMessage:
              data?.errorMessage ?? data?.message ?? data?.error ?? data
          }

          // 判断登录超时
          if (response && response.status === 401) {
            console.error('登录超时', response)
            const loginUrl = response?.headers?.loginurl || ''

            if (loginUrl) {
              // 跳转登录页
              window.location.href = loginUrl
              return Promise.reject(error)
            } else {
              // 页面刷新
              window.location.reload()
              return Promise.reject(error)
            }
          }
          return Promise.reject(errorObj)
        }
      }
    }
  },
])

const buildFileName = (disposition) => {
  let result = null;
  const list = disposition.split(";")
 
  list.forEach(item => {
    if (item.indexOf("filename=") != -1) {
      const name = item.split("filename=");
      result = decodeURI(name[1])
    }
  });
  return result;
}

封装接口

 export function exportResult(data) {
    return httpApi({
        instanceName: 'exportExcel',
        url: '/**/',
        method: 'post',
        data
    })
}

 export function downloadSyncLog(params) {
    return httpApi({
        instanceName: 'downloadLog',
        url: '/**/',
        method: 'get',
        params
    })
}

代码中使用:文章来源地址https://www.toymoban.com/news/detail-799815.html

// 导出数据excel
exportData() {
  let params = this.getSearchParams();
  params.count = this.pagesUp.total;//导出下载必填
  exportResult(params).then(res => {
    //这个里面的data 的二进制文件 创建一个文件对象
    let blob = new Blob([res.data || ""], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
    let downloadElement = document.createElement('a')//创建一个a 虚拟标签
    let href = window.URL.createObjectURL(blob) // 创建下载的链接
    downloadElement.href = href;
    downloadElement.download = "test文件名"; // 下载后文件名
    document.body.appendChild(downloadElement)
    downloadElement.click() // 点击下载
    document.body.removeChild(downloadElement) // 下载完成移除元素
    window.URL.revokeObjectURL(href) // 释放掉blob对象
    this.$message.success('导出成功')
  }).catch(e => {
    this.$message.error('导出失败')
  })
},
// 日志下载
download(row){
  downloadSyncLog({syncTaskId:row.syncTaskId}).then(res => {
    let blob = new Blob([res.data || ""], {
        type: 'application/text'
    });
    let downloadElement = document.createElement('a')//创建一个a 虚拟标签
    let href = window.URL.createObjectURL(blob) // 创建下载的链接
    downloadElement.href = href;
    downloadElement.download = row.syncTaskId+'.log'; // 下载后文件名
    document.body.appendChild(downloadElement)
    downloadElement.click() // 点击下载
    document.body.removeChild(downloadElement) // 下载完成移除元素
    window.URL.revokeObjectURL(href) // 释放掉blob对象
    this.$message.success('下载成功')
  }).catch(e => {
    this.$message.error('下载失败')
  })
},

到了这里,关于vue如何通过$http的post方法请求下载二进制的Excel文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RestTemplate.postForEntity 方法进行 HTTP POST 请求

    RestTemplate 是 Spring Framework 提供的一个用于处理 HTTP 请求的客户端工具。其中,postForEntity 是 RestTemplate 提供的用于发送 HTTP POST 请求并返回 ResponseEntity 对象的方法。 url(String):HTTP POST 请求的目标URL。 request(Object):要发送的请求体数据,通常是一个对象,它将被转换为请

    2024年02月03日
    浏览(50)
  • vue 后端返回二进制流-前端通过blob对象下载文件-图片

    前言 在实际开发中我们经常会遇见下载文件的场景,比如下载合同,下载文件 下载文件有2种方式,一种是后端返回二进制流,前端通过blob对象接受根据不同类型下载 还有一种把地址直接在浏览器新窗口打开浏览器打开pdf可以预览和下载,其他文件直接下载 但不管是那种方

    2024年02月05日
    浏览(81)
  • http请求中get和post方法的区别

    超文本传输协议(HTTP)的设计目的是保证客户端与服务器之间的通信。 HTTP 的工作方式是客户端与服务器之间的请求-应答协议。 web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。 举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返

    2024年02月03日
    浏览(59)
  • HTTP请求方法之POST请求的三种常见数据提交格式

    目录 🌐 application/x-www-form-urlencoded 🌐 multipart/form-data 🌐 application/json    本文所讲的 POST 请求是 HTTP/1.1 协议中规定的众多 HTTP 请求方法的其中最常用的一个。一般使用 POST 请求方法向服务器发送数据(主要是一些创建更新操作),本文讨论的是 POST 请求方法常用的三种数据

    2024年02月09日
    浏览(72)
  • HTTP POST接口带参数的HttpClient请求方法和调用

    接口自动化测试,今天遇到POST接口带参数,参数在url上,发现原来的工具类中没有该方法,重新调试加上。  doPost方法如下: 参考: [Java 接口自动化框架]httpclient4.5.3(CloseableHttpClient) https的工具类HttpsClientUtils

    2024年02月06日
    浏览(48)
  • C语言通过IXMLHTTPRequest以get或post方式发送http请求获取服务器文本或xml数据

    做过网页设计的人应该都知道ajax。 Ajax即Asynchronous Javascript And XML(异步的JavaScript和XML)。使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变的信息。 在IE浏览器中,Ajax技术就是

    2024年01月25日
    浏览(62)
  • 【接口】HTTP(3) |GET和POST两种基本请求方法有什么区别

    在我面试时,在我招人面试别人时,10次能遇到7次这个问题,我听过我也说回答过: Get: 一般对于从服务器取数据的请求可以设置为get方式 Get方式在传递参数的时候,一般都会把参数直接拼接在url上 Get请求方法可以传递的参数数据量是有限的(因为一般参数是拼接在url上,

    2024年04月12日
    浏览(49)
  • Python使用POST方法发送HTTP请求的15个示例(基于requests)

    以下是使用 requests 库调用HTTP接口进行POST请求的15个示例: 发送简单的POST请求: 发送JSON格式的POST请求: 发送XML格式的POST请求: 发送文件的POST请求:

    2024年02月10日
    浏览(45)
  • 使用HuTool的Http工具发送post传递中文参数,请求会乱码的解决方法

    Hutool 是一款功能丰富、易用的Java工具类库,我们在工作中经常会使用它的各种类库方法简化我们的开发,其中我们甚至能通过它的Http工具类直接发送http的各种请求,下面来介绍一下发送post请求时参数中有中文出现乱码的解决方法。 这样就不会造成请求参数出现乱码问题

    2024年02月01日
    浏览(43)
  • 【HTTP】URL结构、HTTP请求和响应的报文格式、HTTP请求的方法、常见的状态码、GET和POST有什么区别、Cookie、Session等重点知识汇总

    目录 URL格式 HTTP请求和响应报文的字段? HTTP请求方法 常见的状态码 GET 和 POST 的区别 Cookie 和 Session ? :是用来分割URL的主体部分(通常是路径)和查询字符串(query string)查询字符串是一组键值对的参数 query string :是键值对的结构,分割键值对,=分割键和值 Content-Type

    2024年02月07日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包