vue实现pdf/文件下载(支持post方式)

文章讲述了在前端开发中遇到的文件下载问题,由于默认的a标签使用GET方式导致下载文件乱码。作者发现后台要求POST方式下载,于是参考了前人的代码,使用创建form表单并提交的方式来实现POST请求的文件下载。代码中还涉及到动态添加输入参数及提交表单的功能。
摘要由CSDN通过智能技术生成

日常工作问题记录:

文件下载本来一开始想用a标签做,但是下载出来的文件乱码,后来查询发现是请求方式的错误,后台下载文件是post方式,而a标签默认是get方式。

后来在项目里找了找,发现前人有大佬做了相关的文件下载,代码如下,有一部分没懂应用场景,如果有大佬看到麻烦帮忙解答一下。

function downloadFile(url, method, params) {
      let oForm = document.createElement('form')
      // 给form附上属性
      oForm.type = 'hidden';
      oForm.action = url;
      oForm.method = method;
      // 下面这段代码应用场景我也不清楚,看到其他人这么写的,我记录下来,可能有多文件下载吧
      if ((typeof params !== 'undefined') && (Object.keys(params).length > 0)) {
        for (const key in params) {
          let temInput = document.createElement('input')
          temInput.name = key
          temInput.value = params[key]
          oForm.appendChild(temInput)
        }
      }

      let rms = document.createElement('input')
      rms.name = 'rms'
      rms.value = 1
      oForm.appendChild(rms)
      document.body.appendChild(oForm)
      oForm.submit()
    }

在vue页面里,调用此方法:

import { downloadFile } from 'xxx.js'

在某个按钮上添加点击事件,调用此方法

<button @click='downloadPDF' />

methods:{
    downloadPDF(){
        let url = '/api/xxxx/xxx'
        // 也可能你不需要这个参数
        let params = { xxx }
        let method = 'post'
        // 调用引入的封装好的方法
        downloadFile(url , method , params) 
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue实现POST方式下载文件流的基本步骤如下: 1. 创建一个XHR对象,并设置请求方式POST ```javascript let xhr = new XMLHttpRequest(); xhr.open('POST', url, true); ``` 2. 设置请求头信息,以告诉服务器需要返回文件流数据 ```javascript xhr.setRequestHeader('Content-type', 'application/json'); xhr.setRequestHeader('Accept', 'application/octet-stream'); ``` 3. 设置响应类型为blob,以便将文件流数据转换为Blob对象 ```javascript xhr.responseType = 'blob'; ``` 4. 发送请求,并处理响应数据 ```javascript xhr.onload = function() { if (xhr.status === 200) { // 获取响应数据 let blob = xhr.response; // 创建一个<a>标签,并设置下载链接和文件名 let a = document.createElement('a'); a.href = window.URL.createObjectURL(blob); a.download = filename; // 触发点击事件,开始下载文件 a.click(); } }; xhr.send(JSON.stringify(data)); ``` 完整代码如下: ```javascript export function downloadFile(url, data, filename) { let xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.setRequestHeader('Content-type', 'application/json'); xhr.setRequestHeader('Accept', 'application/octet-stream'); xhr.responseType = 'blob'; xhr.onload = function() { if (xhr.status === 200) { let blob = xhr.response; let a = document.createElement('a'); a.href = window.URL.createObjectURL(blob); a.download = filename; a.click(); } }; xhr.send(JSON.stringify(data)); } ``` 调用方式: ```javascript downloadFile('/api/download', {fileId: '123'}, 'file.pdf'); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值