js 前端接收后台传过来的文件流

有的时候,由于服务器文件不是开放的,所以可能会需要前端用ajax传一段加密信息才能下载,而且返回的是文件流,不能直接用location.href或a标签直接下载,这时候我们怎么办呢?

情况一:验证信息是在header


//http.js
import Vue from "vue";
import axios from "axios";
//定义获取文件流函数
export function downLoad(obj) {
  return axios.get(paramsData.url, {
    params: paramsData.dat,
    baseURL: "/foo",
    headers: {
      "busi-sign": paramsData.token
    },
    responseType: "arraybuffer"
  });
}


//调用
import { downLoad } from "@/utils/http";

clickDownload(){
 let data = {
        fileKey: 'fileKey',
        time: (new Date()).getTime()
      };
 let paramsData= {
          
          url: "/file/downloadFile",
          token: token,
          dat: data
        };

downLoad(paramsData).then(response => {
         //获取文件名称与文件类型
          const filename = response.headers["file-name"];
          const contentType = response.headers["content-type"];
        //创建a标签
          let linkElement = document.createElement("a");
        //创建 blob对象 第一个参数 response.data是代表后端返回的文件流  ,第二个参数设置文件类型
          let  blob = new Blob([response.data], {
            type: contentType
          });
        //生成生成下载链接  这个链接放在a标签上是直接下载,放在img上可以直接显示图片问价,视频同理
          const url = window.URL.createObjectURL(blob);
           
          let linkElement = document.createElement("a");
          linkElement.setAttribute("href", url);
          linkElement.setAttribute("target", '_blank');
          linkElement.setAttribute("download", filename);
        //模拟点击a标签
          if (typeof MouseEvent == "function") {
            var event = new MouseEvent("click", {
              view: window,
              bubbles: true,
              cancelable: false
            });
            linkElement.dispatchEvent(event);
          }  
        })

}

情况二:验证信息在url上的,则直接生成url就可以了

async fileDownload(params){
        //获取授权码函数
       const res = await getAuthCode(params)
       if(res.code == 0){
         this.authCode=res.data
      }
      let url =  `http://testDownload.com/file?fileKey=${fileKey}&authCode=${authCode}`;
      let linkElement = document.createElement("a");
      linkElement.setAttribute("href", url);
      linkElement.setAttribute("target", '_blank');
      if (typeof MouseEvent == "function") {
        let event = new MouseEvent("click", {
         view: window,
         bubbles: true,
         cancelable: false
          });
       linkElement.dispatchEvent(event);
      }else if (navigator.appVersion.toString().indexOf(".NET") > 0) {
                //如果具备msSaveBlob函数  则直接使用msSaveBlob函数直接保存文件
            window.navigator.msSaveBlob(blob, filename);
      } 
    },

至此完成,如果对你有帮助,请点个双击么么哒!

如有不解,请加群897149839

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在前端页面展示后台返回的 PDF 文件,可以通过以下步骤实现: 1. 后台返回 PDF 文件:确保后台接口正确地返回 PDF 文件的字节。这通常可以通过使用合适的后台框架或库来实现。 2. 前端接收文件:在前端使用 JavaScript,通过 AJAX 或 Fetch API 发起请求,获取后台返回的 PDF 文件。可以将文件保存到一个变量中。 3. 创建 Blob 对象:使用 JavaScript 的 Blob 对象,将文件转换为可供浏览器解析的对象。Blob 对象代表了一个不可变的、原始数据的类文件对象。 ```javascript // 假设后台返回的文件保存在 response 中 var blob = new Blob([response], { type: 'application/pdf' }); ``` 在上述代码中,我们使用 Blob 构造函数,将后台返回的文件 response 转换为 Blob 对象,并指定 MIME 类型为 'application/pdf'。 4. 创建 URL 对象:使用 JavaScript 的 URL 对象,创建一个指向 Blob 对象的 URL。这个 URL 可以被用于在浏览器中打开或下载文件。 ```javascript var fileUrl = URL.createObjectURL(blob); ``` 在上述代码中,我们使用 URL.createObjectURL() 函数,将 Blob 对象转换为 URL。这个 URL 可以被用于在浏览器中展示或下载文件。 5. 展示 PDF 文件:可以使用 `<iframe>` 元素或者 PDF.js 等技术在前端页面中展示 PDF 文件。 使用 `<iframe>` 展示 PDF 文件: ```html <iframe src="fileUrl" width="100%" height="500px"></iframe> ``` 在上述代码中,我们将前面创建的 fileUrl 设置为 `<iframe>` 的 src 属性,从而在页面中展示 PDF 文件。 使用 PDF.js 展示 PDF 文件:PDF.js 是一个开源的 JavaScript 库,可以在前端页面中渲染和展示 PDF 文件。您可以参考 PDF.js 的文档和示例来了解如何在页面中使用它。 通过上述步骤,您可以将后台返回的 PDF 文件展示在前端页面中,并提供给用户查看或下载。请注意,这只是一种基本的实现方式,具体的实现可能会根据您使用的前端框架或库有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值