最新更新时间:2021年08月12日14:42:40

《猛戳-查看我的博客地图-总有你意想不到的惊喜》

本文内容:前端开发过程中,经常会遇到下载文件到本地的需求,用户点击一个按钮,浏览器会将文件下载到电脑本地,比如下载word、excel、ppt。下载文件有两种方案:前端生成并下载、后端生成传递给前端

在前端生成文件并下载到本地

以生成一个json文件为例

downloadFile = () => {const obj = { name:[{key:'1', value:'2'}] };const element = document.createElement('a');element.setAttribute('href', 'data:json/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(obj,null,2)));element.setAttribute('download', 'test.json');element.click();};downloadFile = () => {const obj = { name:[{key:'1', value:'2'}] };const element = document.createElement('a');var blob = new Blob([JSON.stringify(obj,null,2)], {type: 'text/plain'});//使用 Blob 构造函数将文件内容编译为指定格式的二进制element.download = 'test.json';element.href = URL.createObjectURL(blob);//Blob 对象作为 Url 也赋给 a 标签element.click();URL.revokeObjectURL(blob);//回收内存
};

注意:JSON.stringify(obj,null,2),会将单行json字符串格式化(增加换行符和缩进符)写入文件,2表示缩进2个空格

从前端下载在后端生成的文件

网站和被下载的资源没有跨域

可以借助 a 标签的 download 属性

  • 按照文件的默认名称下载,不需要给download赋值
<style>a{text-decoration:none;color: black;}
</style>
<body><a href="../file/bg.jpeg" download>点击下载</a>
</body>
  • 下载过程中给文件重命名,需要给download赋值,这个值是文件的名称
<style>a{text-decoration:none;color: black;}
</style>
<body><a href="../file/bg.jpeg" download="图片">点击下载</a>
</body>

网站和被下载的资源产生跨域

如果被下载的资源和网站的URL产生跨域,采用上面的方案,点击a标签的下载按钮会直接打开这个文件,而不是下载这个文件到本地

  • 采用创建同域url的方式
<li onClick={() => {downloadFile(url, fileName)}}>点击下载</li>function downloadFile(url, fileName) {var xhr = new XMLHttpRequest();xhr.open("GET", url, true);xhr.responseType = 'blob';xhr.onload = function(e) {//xhr.response  Blob {size: 35328, type: "application/msword"}var url = window.URL.createObjectURL(xhr.response);//blob:http://localhost:3001/82ef3951-aba0-4d89-9f0d-5134bc3e58c0var a = document.createElement('a')a.href = urla.download = fileName;a.click()}xhr.send();
}
  • xhr.responseType
responseType支持以下几种值 说明
“” responseType 为空字符串时,采用默认类型 DOMString,与设置为 text 相同
arraybuffer response 是一个包含二进制数据的 JavaScript ArrayBuffer
blob response 是一个包含二进制数据的 Blob 对象
document response 是一个 HTML Document 或 XML XMLDocument,这取决于接收到的数据的 MIME 类型。请参阅 XMLHttpRequest 中的 HTML 以了解使用 XHR 获取 HTML 内容的更多信息
json response 是一个 JavaScript 对象。这个对象是通过将接收到的数据类型视为 JSON 解析得到的
text response 是一个以 DOMString 对象表示的文本
ms-stream response 是下载流的一部分;此响应类型仅允许下载请求,并且仅受 Internet Explorer 支持

createObjectURL

参数 object 用于创建 URL 的 File 对象、Blob 对象或者 MediaSource 对象。
返回值 一个DOMString包含了一个对象URL,该URL可用于指定源 object的内容。

objectURL = URL.createObjectURL(object);

参考资料

  • createObjectURL
  • File
  • Blob
  • MediaSource
  • XMLHttpRequest
  • 使用 JavaScript 创建并下载文件
  • 前端生成文件并下载

感谢阅读,欢迎评论^-^

打赏我吧^-^

PC端下载文件到本地相关推荐

  1. 从服务端下载文件到本地windows

    之前常使用本地ubuntu和远程的centos服务器或者是本地mac和远程centos服务器通过命令scp或者nc来进行文件的传输. 现在用的是windows系统,欲将服务器的某文件load到本地. ...

  2. pc端 下载图片到本地 兼容IE

    参考 纯javascript前端实现base64图片下载(兼容IE10+) 背景 管理后台PC端生成一个二维码,用户需要下载到本地打印出来,用于收费 思路 1.接口取到二维码(二维码图片最好是base ...

  3. Android之解决PC端上传http表单格式文件手机解析文件名乱码问题和PC浏览器下载文件的文件名显示乱码问题

    1 问题 问题1. 手机写socket作为服务器,PC浏览器上传http表单格式文件,然后手机端解析携带中文的文件名我解析是乱码. 问题2. 手机写了socket作为服务器,PC浏览器下载文件,但是浏 ...

  4. 多平台视频PC端下载(持续更新,windows)

    多平台视频PC端下载(持续更新,windows) 说明:仅供学习交流使用,请勿用于商业用途,如有侵权,请联系删除!使用过程中请尊重版权! 文中所用的视频下载器不止用于单一平台,大部分支持多平台,可自行 ...

  5. xshell下载mysql到本地文件_在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)-Go语言中文社区...

    在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...

  6. Unity3D 网页插件Embedded Browser(ZFBrowser)PC端打包文件无法加载网页解决方法

    网页插件Embedded Browser(ZFBrowser)PC端打包文件无法加载网页 介绍:使用Embedded Browser开发unity项目内嵌网页,打包后发现出现一个问题网页插件无响应,而 ...

  7. 微信小程序 - 下载文件到本地、打开文档

    前言 需求场景描述:接口获取到服务器的文件地址,然后在小程序中下载文件到本地手机上.根据文件格式,下载类型分为下面四种情况: 下载图片到本地 下载视频到本地 打开文档,支持格式:doc, xls, p ...

  8. 小程序配置阿里云OSS下载文件,在请求头里配置生成强制下载链接,(拿到下载链接可以下载文件至本地)

    小程序配置阿里云OSS下载文件,在请求头里配置生成强制下载链接,(拿到下载链接可以下载文件至本地)(Win10电脑开发环境)**这里只说明小程序端问题**<菜鸡总结大神勿喷!蟹蟹~> 大体 ...

  9. 在通用计算机内pc是指什么地方,电脑版微信保存的文件在哪里?PC端微信文件保存位置是什么?...

    随着微信越来越融入大家的生活,大家越发依赖微信,人们在微信中进行大量私人社交.办公等行为:聊天.接收文件等.无法使用手机时人们需要用到电脑版微信,在电脑版微信里,接收文件之后如何找到文件的保存位置?P ...

最新文章

  1. 选课微信小程序开发 java
  2. 【译】SQL Server误区30日谈-Day2-DBCC CHECKDB会导致阻塞
  3. Dubbo监控中心搭建-dubbo-monitor-simple的使用
  4. Fortinet 荣膺谷歌云年度安全技术合作伙伴奖
  5. java forkjoin 简书_浅谈Java的Fork/Join并发框架
  6. 论文阅读笔记(十)——Acoustic Scene Classification Using Reduced MobileNet Architecture
  7. 转:java 全角半角转换函数
  8. picGo图片上传到码云失败,报错404-{“message”:“Branch”}的解决方法
  9. 小说阅读网站设计HTML,HTML5+CSS3网站设计基础教程
  10. linux 汇编 变址寻址,【计组】偏移地址、段地址和寻址方式
  11. Ant design分析后台首页
  12. [4G5G专题-38]:物理层- LTE/NR下行公共控制信道PDCCH与其承载的内容下行控制信息格式DCI
  13. 【文献阅读未遂】Understanding data storage and ingestion for large-scale deep recommendation model training
  14. css_解决浏览器显示盒子的实际像素和你设置的像素不一致的问题;
  15. 湖仓一体架构下的数据研发及管理
  16. 2. 【containerd】 containerd-shim-runc-v1与 containerd-shim-runc-v2 区别
  17. 【C#】C# List Sort 按照字母排序 多字段排序
  18. 币市强震,来点理性的心理按摩
  19. Android基础-MMKV基本使用
  20. 聊聊并发(10)生产者消费者模式

热门文章

  1. App加密那点事浅探爱加密原理
  2. libVLC库下载及测试
  3. Oracle 12.2 新特性--PDB和CDB的字符集可以不一样
  4. 手把手教你如何高效落地单项目管理 | 一看既会
  5. iOS软件源怎么找,怎么下载/签名安装?
  6. Beats:Beats 入门教程 (二)
  7. 朱广权迎手语新搭档?百度智能云AI手语主播正式上岗
  8. 本地如何内网穿透映射外网
  9. Echarts使用二:全国地图与各省市地图联动
  10. android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能.pdf