pdf 等所有文件通过blog强制下载函数 downloadFileFromBlobByToken
downloadFileFromBlobByToken
pdf 等所有文件通过blog强制下载函数 downloadFileFromBlobByToken
import { getToken } from '@/libs/util'
export const downloadFile = src => {
console.log(src)
let iframe = document.createElement('iframe')
iframe.src = src
iframe.style.display = 'none'
iframe.style.height = 0
document.body.appendChild(iframe)
setTimeout(() => {
iframe.remove()
}, 3000)
}
/* 通过BLob文件来下载保存文件 */
const downloadFileFromBlob = (blob, fileName) => {
// fileName 一定是要带后缀名的,而且要和blob匹配,否则下载文件打不开
if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE系列兼容,兼容IE10+,Edge12-18
window.navigator.msSaveOrOpenBlob(blob, fileName)
} else {
const downloadElement = document.createElement('a')
const href = window.URL.createObjectURL(blob)
downloadElement.href = href
downloadElement.download = fileName
document.body.appendChild(downloadElement)
downloadElement.click()
document.body.removeChild(downloadElement)
window.URL.revokeObjectURL(href)
}
}
const getFilenameFromUrl = (url) => {
var anchor = url.indexOf('#')
var query = url.indexOf('?')
var end = Math.min(anchor > 0 ? anchor : url.length, query > 0 ? query : url.length)
return url.substring(url.lastIndexOf('/', end) + 1, end)
}
const populateIframe = (url, headers, callback) => {
var xhr = new XMLHttpRequest()
xhr.open('GET', url)
xhr.responseType = 'blob'
headers.forEach((header) => {
xhr.setRequestHeader(header[0], header[1])
})
xhr.onreadystatechange = () => {
if (xhr.readyState === xhr.DONE) {
if (xhr.status === 200) {
// const disposition = xhr.getResponseHeader('content-disposition')
// console.info('xhr.getAllResponseHeaders()', xhr.getAllResponseHeaders())
// console.info('disposition', disposition)
// const matched = /.*filename=(.*)/.exec(disposition) // 匹配
// console.info('matched', matched)
// const matchStr = matched?.[1]?.trim()
// console.info('matchStr', matchStr)
// console.info('decodeURI(matchStr)', decodeURI(matchStr))
// console.info('decodeURIComponent(escape(matchStr))',
// decodeURIComponent(escape(matchStr)))
// console.info('1+2+3',
// decodeURI(decodeURIComponent(escape(matchStr))))
// downloadFileFromBlob(xhr.response, decodeURI(matchStr))
const fileName = getFilenameFromUrl(url)
console.info('fileName', fileName)
downloadFileFromBlob(xhr.response, decodeURI(fileName))
// downloadFileFromBlob(xhr.response, decodeURIComponent(escape(matchStr)))
// callback && callback(URL.createObjectURL(xhr.response))
// callback && callback(URL.createObjectURL(xhr))
// callback && callback(URL.createObjectURL(xhr.response))
}
}
}
xhr.send()
}
export const downloadFileFromBlobByToken = (downloadFileUrl) => {
console.info('downloadFileFromBlobByToken downloadFileUrl', downloadFileUrl)
const headers = [
['token', getToken()]
]
populateIframe(downloadFileUrl, headers)
}
pdf 等所有文件通过blog强制下载函数 downloadFileFromBlobByToken的更多相关文章
- PDF文件预览和下载
背景:项目中实现pdf文件的预览以及下载 环境:jdk1.8.SpringBoot2.0.Maven PDF.js下载地址将下载的源码拷入项目中 修改viewer.js: 将default ...
- PHP如何强制下载文件
很多网站都需要做文件下载的功能.如果直接给连接的方式下载的话有很多的弊处...因为有时候需要对下载权限的检查,对下载次数的检查.所以一般采用php的方法进行安全下载.但是下载的时候如果是txt jpg ...
- pdf流文件的展示、下载、打印;html转为pdf
背景:合同(后台返回pdf流文件)展示.下载.打印,基于angular4 场景区分: 1.checkout页面 —— post接口,入参为offering.shippingInfo.invoice等( ...
- TP5 强制下载PDF
为什么叫强制下载 因为你点击你的PDF文件路劲的话 浏览器是默认字网页上打开,而不是下载 我们需要做的就是 修改header头信息 使其变为下载状态 //下载PDF public functi ...
- 十三、nginx 强制下载txt等文件
当前的浏览器能够识别文件格式,如果浏览器本身能够解析就会默认打开,如果不能解析就会下载该文件. 那么使用nginx做资源服务器的时候,如何强制下载文件呢? location /back/upload/ ...
- 记录一个php强制下载文件函数
整理个经常用的强制下载文件的函数,之前就说把一些常用的东西整理出来结果老是没时间,最近陆续把这些东西整理下. public function download() { $id = $this-> ...
- php进行文件的强制下载
浏览器下载文件,例如在浏览器中可以直接打开的文件(.gif /.txt等).在进行文件下载操作时,默认是通过浏览器直接打开,而不是下载保存文件.并且通过这种方法下载文件可以不暴漏下载文件所在的路径,可 ...
- Nginx配置指定媒体类型文件强制下载
由于业务需要,在点击显示链接(如www.xxx.com/2015-01-15/xxx.png)显示媒体资源(如图片.视频.音频.文档),而在点击下载链接(如www.xxx.com/2015-01-15 ...
- 文件上传和下载(可批量上传)——Spring(二)
针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...
- SpringBoot下文件上传与下载的实现
原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...
随机推荐
- 深度学习实践篇[17]:模型压缩技术、模型蒸馏算法:Patient-KD、DistilBERT、DynaBERT、TinyBERT
深度学习实践篇[17]:模型压缩技术.模型蒸馏算法:Patient-KD.DistilBERT.DynaBERT.TinyBERT 1.模型压缩概述 1.2模型压缩原有 理论上来说,深度神经网络模型越 ...
- C/C++ 通过CRC32实现反破解
我们可以通过使用CRC32算法计算出程序的CRC字节,并将其写入到PE文件的空缺位置,这样当程序再次运行时,来检测这个标志,是否与计算出来的标志一致,来决定是否运行程序,一旦程序被打补丁,其crc32 ...
- Liunx知识点整理
Linux知识点整理 目录和文件 ls (list)显示当前目录下的文件或目录 a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出) l 除文件 ...
- Java浅谈BufferedReader
既然Scanner简单好用,为什么要用BufferedReader呢? 主要原因是面对大量的读入显得较慢且不安全,这里体现在三个方面,一方面是解析的问题,好用意味着封装的更复杂,一拖n的接口解析起来会 ...
- Proteus仿真出现“Internal Exception: access violation in module ‘LOADERS.DLL‘ [00020627].”错误
Proteus仿真问题 在使用 Proteus 8.4 进行仿真时, 出现错误提示 Internal Exception: access violation in module 'LOADERS.DL ...
- .NET Core开发实战(第28课:工作单元模式(UnitOfWork):管理好你的事务)--学习笔记
28 | 工作单元模式(UnitOfWork):管理好你的事务 工作单元模式有如下几个特性: 1.使用同一上下文 2.跟踪实体的状态 3.保障事务一致性 我们对实体的操作,最终的状态都是应该如实保存到 ...
- select * 的使用说明
一. SELECT * 的含义 select * 语句是从指定的表中按照顺序返回所有列. 二. SELECT * 的优缺点 1 优点 在实际开发过程中,大家习惯性地使用select * from ...
- [Java]Map接口有关总结
Map接口 1.HashMap和Hashtable的区别 线程安全方面.HashMap是非线程安全的,Hashtable是线程安全的.因为Hashtable内部方法基本都经过synchronized修 ...
- FreeSWITCH在session上执行特定dialplan
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 日常开发中,会遇到需要在已存在的session上执行特定拨号方案的情况,今天整理下这方面的内容,我将从以下几个方面进 ...
- 如何更改 C# Record 构造函数的行为
如何更改 C# Record 构造函数的行为 Record 是 C# 9 中的一个新功能.Record是从Structs借用的特殊类, 因为它们具有 基于值的相等性,您可以将它们视为两类类型之间的混合 ...