相关文章推荐
忧郁的海龟  ·  JS 实现 ...·  1 月前    · 
活泼的柚子  ·  blob转file ...·  1 月前    · 
直爽的烤红薯  ·  java ...·  1 月前    · 
睿智的领结  ·  Spring Cloud ...·  1 年前    · 
眼睛小的香瓜  ·  EF Core For ...·  1 年前    · 

javascript Blob对象实现文件下载

作者:最强菜鸟

这篇文章主要为大家介绍了vue组件通信的几种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

最近遇到一个需求,文件下载,但需要鉴权,这就意味着不能用后台返回下载链接的方式进行下载,因为一旦被别人拿到这条链接,就可以不需要任何权限就直接下载,因此需要换种思路,在一番百度之后,了解到了blob对象,这就是本文要讲的内容

注意:本文仅为记录学习轨迹,如有侵权,联系删除

一、Blob对象

Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

blob下载思路:

1) 使用ajax发起请求,指定接收类型为blob(responseType: ‘blob')
2)读取请求返回的头部信息里的content-disposition,返回的文件名就在这里面(或者自定义文件名,可跳过此步骤)
3)使用URL.createObjectURL将请求的blob数据转为可下载的url地址
4)使用a标签下载

// 下载 export function download(query,newFileName) { return request({ url: '/file/download', method: 'get', responseType: 'blob', params: query }).then((res) => { * blob下载思路 * 1) 使用ajax发起请求,指定接收类型为blob(responseType: 'blob') * 2)读取请求返回的头部信息里的content-disposition,返回的文件名就在这里面(或者自定义文件名,可跳过此步骤) * 3)使用URL.createObjectURL将请求的blob数据转为可下载的url地址 * 4)使用a标签下载 let blob = res.data // 从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名; // let patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*') // let contentDisposition = decodeURI(res.headers['content-disposition']) // let result = patt.exec(contentDisposition) // let fileName = result[1] //将请求的blob数据转为可下载的url地址 let url = URL.createObjectURL(blob) // 创建一个下载标签<a> const aLink = document.createElement('a') aLink.href = url // 2.直接使用自定义文件名,设置下载文件名称 aLink.setAttribute('download', newFileName ) document.body.appendChild(aLink) // 模拟点击下载 aLink.click() // 移除改下载标签 document.body.removeChild(aLink);

调用该方法

download(row) { // filePath:文件路径,例如:e:\upload\ // fileName:文件名, 例如:a.xlsx let form = { filePath: row.filePath, fileName: row.fileName, //下载,row.fileOriginalName是文件的原始名称,仅仅用于文件下载时起个名字而已 download(form, row.fileOriginalName); // 由于本人使用的是阿里的oss服务,所以只需要传个文件路径回去后端,根据文件路径查询oss接口得到返回的文件流即可,例如(BufferedInputStream),在响应头设置好返回的类型即可

后端这里用了阿里的oss服务,直接拿到文件流(new BufferedInputStream(ossObject.getObjectContent())),如果是非oss的情况下,只需要读取对应服务器上面的文件(File),转成BufferedInputStream后,直接套用下面的代码即可(即通过response.getOutputStream()设置BufferedOutputStream 就行了)

// response:响应 // filePath:文件路径,例如:e:\upload\ // fileName:文件名, 例如:a.xlsx public void download(HttpServletResponse response, String filePath, String fileName) { //待下载文件名 response.reset(); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。 OSSObject ossObject = ossClient.getObject(bucketName, filePath + "/" + fileName); BufferedInputStream in = null; BufferedOutputStream out = null; byte[] buff = new byte[1024]; int length = 0; try { in = new BufferedInputStream(ossObject.getObjectContent()); out = new BufferedOutputStream(response.getOutputStream()); while ((length = in.read(buff)) != -1){ out.write(buff,0,length); } catch (IOException e) { e.printStackTrace(); } finally { if(out != null){ try { out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); if(in != null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); if (ossClient != null) { ossClient.shutdown();

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

您可能感兴趣的文章:
  • TypeScript中的交叉类型和联合类型示例讲解
    TypeScript中的交叉类型和联合类型示例讲解
    2022-12-12
  • 详解JavaScript中的before-after-hook钩子函数
    详解JavaScript中的before-after-hook钩子函数
    2022-12-12
  • JavaScript自动内存管理与垃圾回收策略详细分析讲解
    JavaScript自动内存管理与垃圾回收策略详细分析讲解
    2023-01-01
  • 使用element-ui的upload组件上传代码包时遇到的问题小结
    使用element-ui的upload组件上传代码包时遇到的问题小结
    2022-12-12
  • 手把手教你如何开发属于自己的一款小程序
    手把手教你如何开发属于自己的一款小程序
    2022-12-12
  • Leaflet 数据可视化实现地图下钻示例详解
    Leaflet 数据可视化实现地图下钻示例详解
    2022-12-12
  • Leaflet 基础入门教程示例
    Leaflet 基础入门教程示例
    2022-12-12
  • 全面详解JS正则中匹配技巧及示例
    全面详解JS正则中匹配技巧及示例
    2022-12-12
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2023 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号