如何实现文件下载.docx
《如何实现文件下载.docx》由会员分享,可在线阅读,更多相关《如何实现文件下载.docx(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、如何实现文件下载反响还不错时隔多日由于最近有研究一些媒体相关的工作因此打算对下载做一个整理因此他的兄弟篇诞生了带你领略文件下载的奥秘。本文会花费你较长的时间浏览建议先珍藏/点赞然后查看你感兴趣的局部平时可以以充当当做字典的效果来查询。:)不整不知道一整居然整出这么多情况我只是想简单地做个页面仔。一图览全文可以先看看大纲适不合适自己假如你喜欢那么继续往下浏览。一文解析文件下载这一节呢主要介绍一些前置知识对一些根底知识的介绍假如你觉得你是这个。你可以跳过前言。以及荣耀王者讲你嘛呢_荣耀_王者表情前端的文件下载主要是通过a再加上download属性,有了它们让我们的下载变得简单。download此属
2、性指示阅读器下载URL而不是导航到它因此将提示用户将其保存为本地文件。假如属性有一个值那么此值将在下载保存经过中作为预填充的文件名假如用户需要仍然可以更改文件名。此属性对允许的值没有限制但是/以及会被转换为下划线。大多数文件系统限制了文件名中的标点符号故此阅读器将相应地调整建议的文件名。(摘自s:/developer.mozilla.org/zh-CN/docs/Web/HTML/Element/a)注意:此属性仅适用于同源URL。尽管HTTPURL需要位于同一源中但是可以使用blob:URL以及data:URL以方便用户下载使用JavaScript生成的内容例如使用在线绘图Web应用程序创立
3、的照片。因此下载url主要有三种方式。(本文大局部以blob的方式进展演示)image-20202030153314861兼容性可以看到它的兼容性也非常的可观s:/caniuse/#searchdownloadimage-20202017232216749为了防止很多代码的重复性因为我抽离出了几个公共函数。(该局部可跳过名字都比拟可读之后假设是遇到不明白那么可以在这里寻找)exportfunctiondownloadDirect(url)constaTagdocument.createElement(aaTag.downloadurl.split(/).pop();aTag.hrefurl;a
4、Tag.click()exportfunctiondownloadByContent(content,filename,type)constaTagdocument.createElement(aaTag.downloadfilename;constblobnewBlob(content,type);constblobUrlURL.createObjectURL(blob);aTag.hrefblobUrl;aTag.click();URL.revokeObjectURL(blob);exportfunctiondownloadByDataURL(content,filename,type)c
5、onstaTagdocument.createElement(aaTag.downloadfilename;constdataUrldata:$type;base64,$window.btoa(unescape(encodeURIComponent(content)aTag.hrefdataUrl;aTag.click();exportfunctiondownloadByBlob(blob,filename)constaTagdocument.createElement(aaTag.downloadfilename;constblobUrlURL.createObjectURL(blob);a
6、Tag.hrefblobUrl;aTag.click();URL.revokeObjectURL(blob);exportfunctionbase64ToBlob(base64,type)constbyteCharactersatob(base64);constbyteNumbersnewArray(byteCharacters.length);for(letiibyteCharacters.length;i)byteNumbersibyteCharacters.charCodeAt(i);constbufferUint8Array.from(byteNumbers);constblobnew
7、Blob(buffer,type);returnblob;? (手动给不看以上内容的大佬画分割线?所有例如Github地址:s:/github/hua1995116/node-demo/tree/master/file-download在线Demo:s:/qiufeng.blue/demo/file-download/index.html前端文件下载本文后端所有例如均以koa/原生js实现。后端返回文件流这种情况非常简单我们只需要直接将后端返回的文件流以新的窗口翻开即可直接下载了。/前端代码buttonidoBtnDownload点击下载/buttonscriptoBtnDownload.on
8、clickfunction()window.open(:/localhost:8888/api/download?filename1597375650384.jpg,_blank)/script/后端代码router.get(/api/download,async(ctx)constfilenamectx.query;constfStatsfs.statSync(path.join(_dirname,./static/,filename);ctx.set(Content-Type:application/octet-stream,Content-Disposition:attachment;f
9、ilename$filename,Content-Length:fStats.size);ctx.bodyfs.readFileSync(path.join(_dirname,./static/,filename);可以让阅读器自动下载文件主要有两种情况:一种为使用了Content-Disposition属性。我们来看看该字段的描绘。在常规的HTTP应答中Content-Disposition响应头指示回复的内容该以何种形式展示是以内联的形式即网页或页面的一局部还是以附件的形式下载并保存到本地-来源MDN(s:/developer.mozilla.org/zh-CN/docs/Web/HTTP
10、/Headers/Content-Disposition)再来看看它的语法Content-Disposition:inlineContent-Disposition:attachmentContent-Disposition:attachment;filenamefilename.jpg很简单只要设置成最后一种形态我就能成功让文件从后端进展下载了。另一种为阅读器无法识别的类型例如输入:/localhost:8888/static/demo.sh阅读器无法识别该类型就会自动下载。不知道小伙伴们有没有遇到过这样的一个情况我们输入一个正确的静态js地址没有配置Content-Disposition但
11、是却会被意外的下载。例如像以下的情况。2020-08-30-17.01.52006r3PQBjw1fav4dsikh6j308c0g5gm1这很可能是由于你的nginx少了这一行配置.includemime.types;导致默认走了application/octet-stream阅读器无法识别就下载了文件。后端返回静态站点地址通过静态站点下载这里要分为两种情况一种为可能该效劳自带静态目录即为同源情况第二种情况为适用了第三方静态存储平台例如阿里云、腾讯云之类的进展托管即非同源当然也有些平台直接会返回。同源情况下是非常简单先上代码直接调用一下函数就能轻松实现下载。importdownloadDir
12、ectfrom./js/utils.jsaxios.get(:/localhost:8888/api/downloadUrl).then(resif(res.data.code0)downloadDirect(res.data.data.url);我们可以以从MDN上看到固然download限制了非同源的情况但是但是但是可以使用blob:URL以及data:URL因此我们只要将文件内容进展下载转化成blob就可以了。整个经过如下image-20202030174735143buttonidoBtnDownload点击下载/buttonscripttypemoduleimportdownload
13、ByBlobfrom./js/utils.jsfunctiondownload(url)axios(method:get,url,responseType:blob).then(resdownloadByBlob(res.data,url.split(/).pop();)oBtnDownload.onclickfunction()axios.get(:/localhost:8888/api/downloadUrl).then(resif(res.data.code0)download(res.data.data.url);)/script如今非同源的可以以愉快地下载啦。后端返回字符串base6
14、4有时候我们也会遇到一些新手后端返回字符串的情况这种情况很少见但是来了我们也不慌顺便可以向后端小哥秀一波操作不管啥数据咱都能给你下载下来。ps:前提是平安无污染的资源:),正经文章的招牌闪闪发光。这种情况下我需要模拟下后端小哥的骚操作因此有后端代码。994b6f2egy1fgryfevtpvj208c08cmxd核心经过image-20202030174752476/node端router.get(/api/base64,async(ctx)constfilenamectx.query;constcontentfs.readFileSync(path.join(_dirname,./stati
15、c/,filename);constfStatsfs.statSync(path.join(_dirname,./static/,filename);console.log(fStats);ctx.bodycode:0,data:base64:content.toString(base64),filename,type:mime.getType(filename)/前端buttonidoBtnDownload点击下载/buttonscripttypemoduleimportbase64ToBlob,downloadByBlobfrom./js/utils.jsfunctiondownload(
16、base64,filename,type)constblobbase64ToBlob(blob,type);downloadByBlob(blob,filename);oBtnDownload.onclickfunction()axios.get(:/localhost:8888/api/base64?filename1597375650384.jpg).then(resif(res.data.code0)download(res.data.data);)/script思路其实还是利用了我们上面讲的a标签。但是在这个步骤前多了一个步骤就是需要将我们的base64字符串转化为二进制流这个东西在我
17、的前一篇文件上传中也常常提到毕竟文件就是以二进制流的形式存在。不过也很简单js拥有内置函数atob。极大地进步了我们转换的效率。上面介绍借助后端来完成文件下载的相关方法接下来我们来介绍介绍纯前端来完成文件下载的一些方法。方法一:blob:URLimage-20202031230800538方法二:data:URLimage-20202031230810963由于data:URL会有长度的限制因此下面的所有例子都会采用blob的方式来进展演示。json/text下载text以及json非常的简单可以直接构造一个Blob。Blob(blobParts,options)返回一个新创立的Blob对象其
18、内容由参数中给定的数组串联组成。/htmltextareanameidtextcols30rows10/textareabuttonidtextBtn下载文本/buttonp/ptextareanameidjsoncols30rows10disabledname:秋风的笔记/textareabuttonidjsonBtn下载JSON/button/jsimportdownloadByContent,downloadByDataURLfrom./js/utils.jstextBtn.onclick()constvaluetext.value;downloadByContent(value,hel
19、lo.txt,text/plain/downloadByDataURL(value,hello.txt,text/plainjsonBtn.onclick()constvaluejson.value;downloadByContent(value,hello.json,application/json/downloadByDataURL(value,hello.json,application/json效果图2020-08-30-17.53.32注释代码为data:URL的展示局部由于是第一个例子因此我讲展示代码后面都省略了但是你可以以通过调用downloadByDataURL方法找不到该方法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 实现 文件 下载
限制150内