前端JS下载普通文件(word、excel、pdf等)和二进制blob文件

一、使用FileSaver.js(推荐)

  • 无论后台返回是文件地址还是二进制blob文件,均可兼容实现下载
使用步骤:
  1. npm安装
npm install file-saver --save
  1. 文件引用
import FileSaver from 'file-saver'
  1. 业务使用
FileSaver.saveAs(file, fileName)  // file为文件(文件地址或后台返回的二进制blob文件),fileName为文件名称
  1. DEMO
  • html
<button @click="downloadPDF">下载pdf</button>
<button @click="downloadImg">下载图片</button>
<button @click="downloadBlob">下载二进制文件</button>
  • js
downloadPDF() {
  const PDFFile = 'https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf'
  const PDFFileName = '测试pdf'
  FileSaver.saveAs(PDFFile, PDFFileName)
},
downloadImg() {
  const ImgFile = 'http://bpic.588ku.com/element_origin_min_pic/18/08/24/05dbcc82c8d3bd356e57436be0922357.jpg'
  const ImgFileName = '测试jpg'
  FileSaver.saveAs(ImgFile, ImgFileName)
},
async downloadBlob() {
  // 注:如要下载后台的blob文件流,必须在axios请求配中添加responseType: 'blob',否则解析失败!!!
  const res = await axios.get('XXXX', {
    responseType: 'blob'
  })
  const blobName = '二进制文件'
  FileSaver.saveAs(res, blobName)
},

参考:

二、下载普通文件,使用window.open()

  • 仅支持普通文件下载,不支持文件流下载
  • word、excel会直接下载,图片、pdf则会跳转到预览页(需用户手动下载)

三、下载文件流,使用new Blob(),再通过模拟点击事件完成下载

  • 仅支持文件流下载
  • 须在axios请求配中添加responseType: 'blob',接受后台返回的blob值
const res = await axios.get('XXXX',
  {responseType: 'blob'}
)

const blob = new Blob([res], {
  // type值如后台设置,前端可省略,具体type值可参考https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
  type: 'application/octet-stream' 
})
const downloadElement = document.createElement('a') //创建a标签
const href = window.URL.createObjectURL(blob) //创建DOMString
const filename = "测试下载" //设置文件名字
downloadElement.style.display = 'none' //隐藏a标签
downloadElement.href = href //赋值a标签的href
downloadElement.download = filename //下载后文件名
document.body.appendChild(downloadElement) //插入a标签
downloadElement.click() //点击下载
document.body.removeChild(downloadElement) //下载完成移除元素
window.URL.revokeObjectURL(href) //释放掉blob对象

参考:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 相关包word下载:https://github.com/eligrey/FileSaver.jsjquery.w...
    静_summer阅读 331评论 1 0
  • 问题 文件保存在 OSS,为了避免文件重名覆盖,于是上传文件采用了 UUID 命名(嗯,就是一长串ABCD那种O_...
    於風聽語阅读 46,172评论 17 30
  • 蛤?还有这种操作😲? 我一直以为读写本地文件只有node能实现,但是昨天搞了一个chrome浏览器的拓展应用,不能...
    文者字清阅读 12,306评论 5 3
  • 背景 年前的时候,开发一个电子杂志项目,功能需求是通过上传pdf文件,将其转为图片格式,所以杂志的内容其实就是一张...
    程序员Winn阅读 10,723评论 25 24
  • 最近我同学找到我让我给她看一下她们的项目需求,表格数据导出到 Excel ,实现批量下载,下载的还是压缩包要求是 ...
    CondorHero阅读 2,310评论 0 6