关于blob:前端blob方式导出Excel

封装axios: import axios from "axios";const server = axios.create({ timeout: 20000, withCredentials: true, headers: { "Content-Type": "application/json; charset=utf-8" },});// 申请拦截器server.interceptors.request.use( function (config) { // 在发送申请之前做些什么 let userinfo = JSON.parse(window.localStorage.getItem("userinfo")); if (userinfo) { config.headers.Authorization = userinfo.token; } return config; }, function (error) { // 对申请谬误做些什么 return Promise.reject(error); });// 响应拦挡server.interceptors.response.use( function (response) { // 如果返回的状态码为200,阐明接口申请胜利,能够失常拿到数据否则的话抛出谬误 if (response.status === 200) { // 未登录或者token过期 if (response.data.err === 1) { localStorage.removeItem("userinfo"); setTimeout(() => { router.push("/login"); }, 1000); } else if (response.data.err === 10) { setTimeout(() => { router.push("/nopower"); }, 1000); } return Promise.resolve(response); } else { return Promise.reject(response); } }, function (error) { if (error.response.status) { switch (error.response.status) { case 401: break; case 404: Message.error("网络申请不存在"); break; // 其余谬误,间接抛出谬误提醒 case 500: if (error.response.data.err === 1) { localStorage.removeItem("userinfo"); setTimeout(() => { router.push("/login"); }, 1000); } break; default: Message.error(error.response.data.msg); } return Promise.reject(error.response.data.msg); } });server.adornUrl = (actionName) => { // 非生产环境 && 开启代理, 接口前缀对立应用[/proxyApi/]前缀做代理拦挡! return "/api" + actionName;};export default server;申请接口: ...

August 10, 2022 · 2 min · jiezi

关于blob:聊聊JS的二进制家族BlobArrayBuffer和Buffer

注释事实上,前端很少波及对二进制数据的解决,但即便如此,咱们偶然总能在角落里看见它们的身影。 明天咱们就来聊一聊前端的二进制家族:Blob、ArrayBuffer和Buffer 概述Blob: 前端的一个专门用于反对文件操作的二进制对象ArrayBuffer:前端的一个通用的二进制缓冲区,相似数组,但在API和个性上却有诸多不同Buffer:Node.js提供的一个二进制缓冲区,罕用来解决I/O操作Blob咱们首先来介绍Blob,Blob是用来反对文件操作的。简略的说:在JS中,有两个构造函数 File 和 Blob, 而File继承了所有Blob的属性。 所以在咱们看来,File对象能够看作一种非凡的Blob对象。在前端工程中,咱们在哪些操作中能够取得File对象呢? 请看: (备注:目前 File API标准的状态为Working Draft) 咱们下面说了,File对象是一种非凡的Blob对象,那么它天然就能够间接调用Blob对象的办法。让咱们看一看Blob具体有哪些办法,以及可能用它们实现哪些性能 Blob实战通过window.URL.createObjectURL办法能够把一个blob转化为一个Blob URL,并且用做文件下载或者图片显示的链接。 Blob URL所实现的下载或者显示等性能,仅仅能够在单个浏览器外部进行。而不能在服务器上进行存储,亦或者说它没有在服务器端存储的意义。 上面是一个Blob的例子,能够看到它很短 blob:d3958f5c-0777-0845-9dcf-2cb28783acaf和简短的Base64格局的Data URL相比,Blob URL的长度显然不可能存储足够的信息,这也就意味着它只是相似于一个浏览器外部的“援用“。从这个角度看,Blob URL是一个浏览器自行制订的一个伪协定 Blob下载文件咱们能够通过window.URL.createObjectURL,接管一个Blob(File)对象,将其转化为Blob URL,而后赋给 a.download属性,而后在页面上点击这个链接就能够实现下载了 <!-- html局部 --><a id="h">点此进行下载</a><!-- js局部 --><script> var blob = new Blob(["Hello World"]); var url = window.URL.createObjectURL(blob); var a = document.getElementById("h"); a.download = "helloworld.txt"; a.href = url;</script>备注:download属性不兼容IE, 对IE可通过window.navigator.msSaveBlob办法或其余进行优化(IE10/11) 运行后果 Blob图片本地显示window.URL.createObjectURL生成的Blob URL还能够赋给img.src,从而实现图片的显示 <!-- html局部 --><input type="file" id='f' /><img id='img' style="width: 200px;height:200px;" /><!-- js局部 --><script> document.getElementById('f').addEventListener('change', function (e) { var file = this.files[0]; const img = document.getElementById('img'); const url = window.URL.createObjectURL(file); img.src = url; img.onload = function () { // 开释一个之前通过调用 URL.createObjectURL创立的 URL 对象 window.URL.revokeObjectURL(url); } }, false);</script>运行后果 ...

September 13, 2021 · 2 min · jiezi

关于blob:Js之Blob类型以及文件流下载流程

什么是blob?以下是MDN的官网解释: Blob 对象示意一个不可变、原始数据的类文件对象。它的数据能够按文本或二进制的格局进行读取,也能够转换成 ReadableStream 来用于数据操作。 Blob 示意的不肯定是JavaScript原生格局的数据。File 接口基于Blob,继承了 blob 的性能并将其扩大使其反对用户零碎上的文件。要从其余非blob对象和数据结构一个 Blob,请应用 Blob() 构造函数。实际上 file 对象只是 blob 对象的一个更具体的版本,blob 存储着大量的二进制数据,并且 blob 的 size 和 type 属性,都会被 file 对象所继承。所以, 在大多数状况下,blob 对象和 file 对象能够用在同一个中央,例如,能够应用 FileReader 借口从 blob 读取数据,也能够应用 URL.createObjectURL() 从 blob 创立一个新的 URL 对象。 blob的创立Blob() 构造函数容许通过其它对象创立 Blob 对象。比方,用字符串构建一个 blob var debug = {hello: "world"};var blob = new Blob([JSON.stringify(debug, null, 2)], {type : 'application/json'});构造函数,承受两个参数,第一个为一个数据序列,能够是任意格局的值,例如,任意数量的字符串,Blobs 以及 ArrayBuffers。第二个参数,是一个蕴含了两个属性的对象,其两个属性别离是: type -- MIME 的类型。 endings -- 决定 append() 的数据格式,(数据中的 \n 如何被转换)能够取值为 "transparent" 或者 "native"(t 的话不变,n 的话按操作系统转换;t* 为默认) 。 ...

January 3, 2021 · 1 min · jiezi

关于blob:前端面试每日-31-第624天

明天的知识点 (2020.12.30) —— 第624天 (我也要出题)[html] 应用button当按钮和应用div当按钮有什么区别?[css] 你晓得Less刚进去时是用哪种语言编写的吗?[js] 如何创立视频文件的blob?[软技能] 说说你对图片压缩比的了解《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!!欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨!心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

December 30, 2020 · 1 min · jiezi

前端js实现字符串/图片/excel文件下载

在web开发中,如果你想让用户下载或者导出一个文件,应该怎么做呢?传统的做法是在后端存储或者即时生成一个文件来提供下载功能,这样的优势是可以做权限控制、数据二次处理,但缺点是需要额外发起请求、增大服务端压力、下载速度慢。但随着HTML5的标准发布,我们已经能够做到只前端来下载各种文件了。<a>标签的download属性此属性指示浏览器下载URL而不是导航到它,因此将提示用户将其保存为本地文件。如果属性有一个值,那么它将作为下载的文件名使用。此属性对允许的值没有限制,但是/和\会被转换为下划线。此属性仅适用于同源 URLs。尽管HTTP URL需要位于同一源中,但是可以使用 blob: URLs 和 data: URLs ,以方便用户下载 JavaScript 方式生成的内容(例如使用在线绘图的Web应用创建的照片)。常规的<a>标签,用于链接的跳转,如新的页面,那么如果我们给<a>标签加上download属性,就能很简单的让用户保存新的html页面。<a download=“PHP实现并发请求.html” href=“https://segmentfault.com/a/1190000016343861">PHP实现并发请求</a>生成并下载字符串文件首先我们需要了解一个特殊的数据格式:Blob。Blob数据Blob(Binary Large Object,二进制类型的大对象),表示一个不可变的原始数据的类文件对象,我们上传文件时常用的File对象就继承于Blob,并进行了扩展用于支持用户系统上的文件。我们只能通过Blob()构造函数来创建一个新的Blob对象:Blob(blobParts[, options])// 创建一个json类型的Blob对象,支持传入同类型数据的一个数组var debug = {hello: “world”};var blob = new Blob([JSON.stringify(debug, null, 2)], {type : ‘application/json’});// 此时blob的值// Blob(22) {size: 22, type: ‘application/json’}Blob对象存在两个只读属性:size: Blob 对象中所包含数据的大小(字节)。type: 一个字符串,表明该Blob对象所包含数据的MIME类型。如果类型未知,则该值为空字符串。URL对象和下载字符串文件URL 接口是一个用来创建 URLs 的对象,包含两个静态方法:objectURL = URL.createObjectURL(blob)创建一个 URL(DOMString),包含一个唯一的blob链接(该链接协议为以blob:,后跟唯一标识浏览器中的对象的掩码)。这个 URL 的生命周期和创建它的窗口中的 document 绑定。URL.revokeObjectURL(objectURL)销毁之前使用URL.createObjectURL()方法创建的URL实例。浏览器会在文档退出的时候自动释放它们,但是为了获得最佳性能和内存使用状况,你应该在安全的时机主动释放掉它们。var url = URL.createObjectURL(blob);// 此时url的值,跟document绑定,所以每个页面创建的字符串均不同// blob:https://developer.mozilla.org/defe53c2-2882-43c6-b275-db2a57959789此时,我们在页面中创建一个新<a>标签,点击即可下载我们想要的文件:<a href=“blob:https://developer.mozilla.org/58702010-433d-4097-990f-e483d84cd02a” download=“file.json”>下载文件链接</a>FileReader读取Blob数据想要读取Blob数据的唯一方法是FileReader。FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。其中File对象可以是来自用户在一个<input>元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果。该对象包含3个属性:FileReader.error一个DOMException,表示在读取文件时发生的错误 。FileReader.readyState表示FileReader状态的数字。取值如下:常量名 值 描述EMPTY 0 还没有加载任何数据.LOADING 1 数据正在被加载.DONE 2 已完成全部的读取请求.FileReader.result文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作。包含6个事件处理:onabort,onerror,onload,onloadstart,onloadend,onprogress,这些不再详细说明,因为 FileReader 继承自EventTarget,所以所有这些事件也可以通过addEventListener方法使用。包含5个方法:FileReader.abort()中止读取操作。在返回时,readyState属性为DONE。FileReader.readAsArrayBuffer()开始读取指定的 Blob中的内容, 一旦完成, result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象.FileReader.readAsBinaryString() 开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。FileReader.readAsDataURL()开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容。FileReader.readAsText()开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串以表示所读取的文件内容。因此我们可以直接读取Blob对象的数据:var reader = new FileReader();reader.addEventListener(“loadend”, function() { console.log(reader.result);});reader.readAsDataURL(blob);// 此时result的值// data:application/json;base64,ewogICJoZWxsbyI6ICJ3b3JsZCIKfQ==reader.readAsText(blob);// 此时result的值// {// “hello”: “world”// }下载图片除了下载手动生成的字符串或对象,我们还能提供下载图片的功能,一方面能用于支持Canvas绘图的保存功能,一方面能提供批量下载图片等高级功能。除了浏览器自带的右键保存,我们还可以这么做来下载图片:// 通过src获取图片的blob对象function getImageBlob(url, cb) { var xhr = new XMLHttpRequest(); xhr.open(“get”, url, true); xhr.responseType = “blob”; xhr.onload = function() { if (this.status == 200) { cb(this.response); } }; xhr.send();}let reader = new FileReader();reader.addEventListener(“loadend”, function() { console.log(reader.result);});getImageBlob(‘https://cdn.segmentfault.com/v-5c4ec07f/global/img/user-64.png', function(blob){ // 读取来看下下载的内容 reader.readAsDataURL(blob); // 最终生成的字符串 // data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAA… // 生成下载用的URL对象 let url = URL.createObjectURL(blob); // 生成一个a标签,并模拟点击,即可下载,批量下载同理 let aDom = aDom = document.createElement(‘a’); aDom.href = url; aDom.download = ‘download.json’; aDom.text = ‘下载文件’; document.getElementsByTagName(‘body’)[0].appendChild(aDom); aDom.click();});下载excel文件等如果你明白了下载的原理,那么所有的内容都能够理解,只不过是转换成对应的格式而已,当然,复杂格式的文档不需要你自己去配置,可以引入第三方库,在excel文档方面我选择用 tableExport库:// 引入CDN文件’https://cdn.bootcss.com/xlsx/0.14.1/xlsx.core.min.js','https://cdn.bootcss.com/FileSaver.js/2014-11-29/FileSaver.min.js','https://cdn.bootcss.com/TableExport/5.2.0/js/tableexport.min.js'// 绑定下载事件,这个是我自己的场景下代码,可能不适合大家,具体的参考官方文档const tableDom = $(’#table’);$(’.table-exportBtn’, tableDom).on(‘click’, function () { const tableExport = tableDom.tableExport({ formats: [‘xlsx’, ’txt’], filename: ‘表格下载’, exportButtons: false }); const type = $(this).data().type; const exportData = tableExport.getExportData()[tableDom[0].id][type]; const {data, mimeType, filename, fileExtension} = exportData; tableExport.export2file(data, mimeType, filename, fileExtension);});参考资料MDN-a: https://developer.mozilla.org…MDN-blob: https://developer.mozilla.org…掘金-细说Web API中的Blob:https://juejin.im/post/59e35d…MDN-URL: https://developer.mozilla.org…MDN-FileReader: https://developer.mozilla.org…博客园-js 获取图片url的Blob值并预览:https://www.cnblogs.com/tujia…tableExport文档:https://tableexport.v5.travis… ...

February 13, 2019 · 1 min · jiezi