关于下载:Mac上非常不错的视频抓取工具Downie-4

Downie for Mac是一款Mac OS平台上最好用的视频下载工具,轻松从数千个不同的网站下载视频。反对youtube等支流网站视频,最大的特点最是反对网站多且能够多点同时下载,只需粘贴网址链接到软件界面即可主动下载,超级疾速简略! 软件装置

August 1, 2022 · 1 min · jiezi

关于下载:两种办法解决外网资源下载速度过慢的问题

两种方法解决外网资源下载速度过慢的问题

May 12, 2021 · 1 min · jiezi

关于下载:macOS各版本官方下载地址

咱们经常为了获取到历史版本macos的下载地址而发愁,其实Apple的官网曾经提供了相应的下载地址。 咱们能够的如何创立可疏导的 macOS 装置器中找到相应链接。 各版本下载链接如下:macOS Big Sur、macOS Catalina、macOS Mojave、macOS High Sierra 尔后,再也不须要为下载官网的装置镜像发愁了。

February 15, 2021 · 1 min · jiezi

关于下载:大文件下载及视频点播的CDN加速实践

为了帮忙用户更好地理解和应用CDN产品,CDN利用实际进阶零碎课程开课啦!前几天,阿里云CDN产品专家陈智城在线分享了《大文件下载及视频点播的CDN减速实际》议题,解读大文件下载和视频点播的业务场景、内容散发挑战及对应解决方案。本篇文章,将为你详述分享原文。 关注阿里云边缘计算和CDN官网账号:阿里云Edge Plus ,收费取得讲师课件PPT一、大文件下载和视频点播的内容散发挑战对于下载类的场景来说,常见细分场景包含:手机利用商店、游戏利用商店以及游戏更新和手机操作系统更新等,而对于视频类的利用场景来说,次要细分场景包含短视频、长视频、在线教育、OTT机顶盒、广电传媒和音乐网站等等。 为什么会把下载类的利用场景和视频点播类利用场景放在一起去做比对呢?因为视频点播这个利用场景实际上也是一种大文件下载场景,这两个利用场景有着很高的业务相似性,也有很多共性问题,而它们之间的区别在于视频点播对于拜访的性能会有更高的要求。 两个场景在内容散发方面所面临的挑战次要有三大类: 用户体验问题,次要体现在:国内运营商环境简单,跨运营商拜访成果差;用户散布广,跨地区拜访时延高、速度慢;弱网环境下传输性能差,速度慢、卡顿重大等方面;源站性能与老本问题,次要体现在:核心式部署的源站弹性扩大能力差,无奈接受大规模突发流量以及核心式部署的源站带宽老本昂扬;业务平安问题,次要体现在:时刻面临着DNS劫持(例如被劫持了页面内容,被嵌入了页面广告等)、资源盗链(源站面临带宽老本上的损失)等平安威逼。*二、CDN内容散发网络架构当下,CDN曾经是成为了缓解网络拥塞、进步业务响应速度、晋升用户体验的一种十分重要的技术手段,也是互联网基础设施当中不可或缺的重要组成部分。上面咱们通过阿里云CDN的内容散发网络架构来阐明典型的CDN内容散发网络都蕴含哪些组成部分: (1)调度零碎用户的终端会发动各种利用拜访,比方:点播和下载这两个利用场景。用户的拜访申请会首先去做域名DNS解析,而后用户的域名DNS解析申请将会通过阿里云CDN的调度零碎去解决; (2)链路品质零碎链路品质探测系统的作用是去实时地监测缓存零碎中的每一个节点和链路的实时负载和健康状况,而后反馈给调度零碎,调度零碎会依据用户申请中携带的IP地址信息去解析用户的运营商和区域归属,而后综合链路品质信息为用户调配一个最佳的接入节点; (3)缓存零碎用户收到最佳接入节点的IP当前,就会去拜访这个缓存节点,节点如果曾经缓存了用户申请的资源,那么就将会间接将资源返回给用户;如果L1节点没有命中,会上溯到L2节点,如果L2节点也没有缓存资源,才会返回源站去拉取这个资源;某个资源首次拉取后将会在缓存零碎中缓存下来,这样如果后续用户拜访到同一个资源,就可间接从缓存零碎去拉取资源,防止反复回源;通过分级缓存的这种部署架构能够达到进步内容散发效率、升高回源带宽以及晋升用户体验的成果; (4)撑持服务零碎阿里云CDN在内容散发之外也提供了撑持服务零碎。第一是具备资源监测能力,能够对缓存零碎上客户业务运行的状态进行监测,比方对CDN减速域名的QPS、带宽、http状态码等常见指标实现监控。第二是数据分析,用户能够剖析CDN减速域名的TOP URL、PV、UV等数据。第三是配置管理系统,用户通过该零碎能够下发如缓存文件类型、缓存工夫、去参数缓存等缓存规定,以晋升缓存零碎的运作效率。 三、 CDN如何解决互联网内容散发所面临的问题?上面,从用户体验、源站性能与老本以及业务平安这三个方面来看看CDN是如何解决问题的。 第一,用户体验问题首先,CDN能够为用户提供诸多的就近接入的节点。阿里云CDN建设了一张笼罩寰球六大洲70多个国家的2800多个的节点,全网具备了130Tbps的带宽输入能力,基本上笼罩了国内以及做海内的次要运营商。依靠丰盛的资源节点笼罩,阿里云CDN可能让用户就近接入同运营商节点,解决跨运营商互联互通、远距离拜访时延大等用户体验问题。 其次,晋升用户体验的第二点是须要提供精准的调度能力,阿里云CDN在这里是提供了4项要害的优化措施: 1、继续更新的精准IP数据库:IP数据库的作用是在用户的DNS解析申请转发到了CDN调度零碎时,调度零碎会判断用户的地区和运营商归属,以此来为用户调配就近接入的同运营商CDN节点。为了确保IP数据库的数据处于最新的状态,数据库始终在继续地更新。2、提供HTTPDNS服务(须要客户端兼容):采纳HTTPDNS这项技术使得用户终端能够绕开运营商的local DNS,间接采纳HTTP协定去拜访调度零碎,申请所须要拜访的域名的最优接入节点,这样能够防止DNS劫持所带来的业务平安问题。3、节点数据分析:CDN调度零碎通过链路状态零碎去实时地剖析整个缓存零碎中的所有节点和链路的健康状况,为用户抉择最优的接入节点,防止因为接入节点品质不佳而影响到用户拜访体验。4、基于内容调度,进步拜访命中率:在大文件下载和视频点播这两个利用场景上常常应用302调度这种基于内容的调度技术,302调度是一种核心调度计划,用户在申请某一个资源的时候,在实现域名DNS解析之后,用户申请将会先拜访到核心调度零碎上,而后核心调度零碎将会解析用户申请须要拜访的内容,再通过302重定向的形式为用户调配最佳接入节点。通过采纳以上4项优化措施,可能为用户提供更加精准的调度能力,从而让用户可能接入最佳的CDN节点。 CDN常见的三种调度计划简略对比方下图所示: 这里简略阐明下这三种常见的CDN调度形式的优缺点:(1)DNS调度是最罕用和最通用的调度计划,毛病是存在DNS劫持的危险,调度的精确度也会差一些;(2)302调度非常适合用在大文件下载和视频点播这两个利用场景,长处是能够进步调度的精确度,毛病是将会减少首包的时延(在大文件下载和视频点播场景下对首包时延不太敏感,而对调度精确度要求更高)(3)HTTPDNS调度的长处是有较高的安全性(能够躲避DNS劫持危险)和调度精确度,然而有个很大的毛病,须要客户端提供反对(例如在手机APP上嵌入SDK),通用性较差。 再次,晋升用户体验的第三个优化点是对传输链路做智能优化 1、协定优化:通过调整拥塞算法、丢包探测算法等优化措施,对TCP协定栈的性能做了大幅度晋升,尤其对弱网环境下的网络性能晋升显著;以下两张带宽利用率比照图,右边是规范TCP传输协定,在建设TCP连贯之后,须要通过绝对更长的工夫去晋升带宽利用率,一旦碰到丢包状况,带宽利用率会疾速上涨,并且须要经验慢速爬坡阶段才可能逐渐晋升带宽利用率,尤其在弱网环境下,应用规范TCP协定的状况下,带宽利用率的降落会十分的重大。右侧是阿里云优化后的TCP协定,通过疾速启动、被动拥塞探测和疾速丢包复原等技术优化措施,可能提供更高的带宽利用率,即便在网络条件绝对差一些的状况下,也能够有比拟好的优化成果。 2、连贯减速:通过批改协定栈的 Handshake Timer 来实现疾速重试,以补救因为丢包导致的重试超时;3、长久连贯:在CDN节点间事后建设好 TCP 连贯,并长时间放弃一直开,这样在有新连贯过去的时候就能够间接复用,缩小TCP握手时延。 第二,源站性能、老本压力问题通过进步缓存零碎的效率帮忙客户升高源站的性能和老本压力,次要包含六个方面的技术措施:1、分布式部署:确保用户可能就近拜访同运营商的节点,以此来进步访问速度,解决跨运营商拜访慢、长距离回源时延低等问题;2、多级缓存架构:多级缓存架构中的每一级都可能用来缓存用户申请的资源,多级回源收敛之后能够极大地升高回源流量;3、内容预取:通过内容预取技术提前把源站的内容预取到CDN节点上,缩小回源量和进步缓存命中率;4、合并回源:配置若干个域名的回源申请与某一个域名(业务雷同的状况下)相合并,以缩小反复回源的流量;5、去参数缓存:设置hashkey(缓存key)时,配置去掉资源URL前面的参数,以不带参数的URI作为缓存key,以进步缓存命中率;6、流量管制:提供精细化的流量控制能力,反对单申请流控和全网流控,反对边缘流控和回源流控,可能无效升高客户老本。 下图中标记的序号代表了以上6个技术措施在CDN缓存零碎上的作用地位: 这些技术措施综合起来能够帮忙客户去无效地缩小回源带宽、晋升缓存命中率,从而升高源站的带宽压力、升高源站的带宽老本。 第三,业务平安危险问题阿里云CDN通过牢靠的平安防护措施,去帮忙用户躲避业务上的平安危险。1、防盗链:能够抉择应用Referer、UA、URL、IP等通用鉴权形式,也能够用EdgeScript来定制鉴权规定,反对边缘鉴权和核心鉴权,通过严格校验用户的资源拜访申请来避免源站资源被盗用;2、DNS防劫持:HTTPDNS技术应用HTTP协定拜访阿里云的服务端,取得域名解析后果,能够绕过运营商的Local DNS,防止域名DNS劫持;3、HTTPS传输加密:反对采纳TLS协定来加密HTTP协定内容,避免明文数据裸露在互联网上,并且能够设置TLSv1.3、HSTS等高级性能。 最初,咱们再整体回顾一下,阿里云CDN在大文件下载和视频点播这两大利用场景下提供了哪些的外围能力:1、丰盛的资源节点:可能为用户提供就近接入的同运营商CDN节点,解决长距离接入和跨运营商拜访带来的提早高和速度慢的问题2、精准的调度零碎:可能实时地获取CDN节点的健康状况,并依据用户的所在位置和运营商来调配最合适的接入节点,以便获得最佳接入成果3、智能的传输链路:通过协定优化、连贯优化等措施来升高总体时延、进步传输速度,尤其是进步弱网环境下的传输速度4、高效的缓存策略:高效的缓存策略可能带来更高的用户命中率(命中就近节点上的缓存资源),从而提供更高的访问速度5、牢靠的平安防护:牢靠的平安防护措施可能对用户的资源拜访申请做严格的校验和加密,爱护用户的资源和业务平安 如果对阿里云CDN产品利用进阶感兴趣,能够关注阿里云Edge Plus微信公众号,理解更多产品信息和技术干货

January 20, 2021 · 1 min · jiezi

前端文件下载-ajax下载完毕回调

前端文件下载 ajax下载完毕回调公司项目,文件导出,导出的时间段内,希望可以弹出加载中,一直到后台返回文件。代码及兼容性都比较粗糙,主要是提供个思路。 常规做法1 a链接的方式 把下载地址给到a标签的href上2 window.location.href目标做法思路通过下载文件流,前端生成文件。 实现参考 /** * ajax方式下载文件 * @param {*} url 必填 * @param {*} fileName 必填 如 "学生学籍卡.rar" * @param {*} showLoading 非必填 * @param {*} callBack 非必填 */function getFile({ url, fileName, showLoading, callBack }) { if (!url) return if (!window.XMLHttpRequest || !window.Blob) { // 不兼容处理(ie7以下) window.location.href = url return } const loadingEle = document.getElementById("mainLoading"); if (showLoading && loadingEle) { // 展示加载中... } const xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.responseType = "blob"; xhr.onload = function () { if (showLoading && loadingEle) { // 隐藏加载中.. } if (callBack) callBack() var a = document.createElement("a"); a.download = fileName ; // 文件名 含文件格式 a.href = window.URL.createObjectURL(new Blob([xhr.response]));; document.body.appendChild(a); a.click(); a.remove() }; xhr.send(); }优缺点优点: 下载可控,可以随时停止下载,修改文件名,显示下载进度,提示等待以及回调 等等缺点: 性能影响(待定,大文件应该能体现);格式,后端返回的格式假如不固定该如何处理还没想好;自己封装的问题很多会考虑不周,比如登录超时提示等等;兼容性问题 XMLHttpRequest 以及 Blob这些方法的支持问题。如果你有一套完善的轮子 请贴上地址或代码 借鉴借鉴! ...

July 6, 2019 · 1 min · jiezi

笔记js异步下载文件

之前因为懒,异步请求的下载都是直接写在a标签里,请求权限让后端做特殊处理判断,就像这样<a href="getRequestUrl">点击下载</a>现在觉得这样处理不太好,一个是后端权限要做单独判断,另一个是如果调用接口报错就没办法处理了,研究之后修改了一下,项目用了axios这个lib,所以是针对axios的request和response做了修改,不过对于原生写法和其他库,原理是一样的1.将请求的responseType设置为blobfunction exportData(p) { return axios({ url: '/data/export', method: 'get', params: p, responseType: 'blob' });}2.对response进行处理因为项目里用了response拦截器来处理响应,所以我在拦截器里做了处理,也可以单独处理。 axios.interceptors.response.use( response=> { // ... // Blob类型处理 let checkType = response.config.responseType; if(checkType === "blob" && res.type === 'application/octet-stream') { // 正常下载时直接返回响应数据 return response.data } else if(checkType === "blob" && res.type === 'application/json') { // 请求出错时,接口返回的内容是json,于是将blob中的内容取出 let reader = new FileReader(); reader.onload = function(event){ let content = reader.result; // blob中的内容 Message({ message: JSON.parse(content).desc, type: 'error', duration: 5 * 1000 }) }; reader.readAsText(response.data); return Promise.reject('error') } // ... }, error => { // ... })3.html页面自动开始下载exportData(para).then(res => { let content = res; let aTag = document.createElement('a'); let blob = new Blob([content]); aTag.download = 'Datas.xlsx'; // 也可以让后端设置文件名,通过headers返回 aTag.href = URL.createObjectURL(blob); aTag.click(); URL.revokeObjectURL(blob);}).finally(() => {})参考博客:https://www.cnblogs.com/coder...

July 3, 2019 · 1 min · jiezi

通过 Node 批量下载文件到本地(多文件)

最近在做一个文件下载的功能,这里把做的过程中用的技术和坑简要总结下。上篇文章《通过 JavaScript 下载文件到本地(单文件)》说了下如何下载单文件,这篇主要说下如何做多文件的批量下载多文件分别处理如果文件数量可控,对于下载出来的文件格式无要求,可以用最简单的办法,直接遍历文件,分别给每个下载链接创建一个单文件的download或者iframe下载链接。zip包批量下载虽然说可以遍历所有文件,然后去批量下载单个文件,但是这种体验毕竟不太好,最常见的做法是把批量的文件下载并打包到zip中。所以首先的一个实现思路是:在代理服务里,先去遍历所有的文件去请求文件数据,然后压缩到zip包中,然后再把zip包返回给客户端。这么做对于下载量数据比较小时ok,但是如果批量文件特别多特别大时,用户要等后台把所有的数据都请求到并且都打包都压缩包里,前端才能有反馈,这个时间可能会耗时很长,用户体验可能很差。在同事的前期调研时,有说这里可以做一个流式的边压缩边下载的能力,大致的思路是,chunk回包,加流式压缩。……let fileCounter = 0;const zippedFilename = encodeURIComponent(downloadData.name);const list = downloadData.list || [];const header = { ‘Content-Type’: ‘application/x-zip’, ‘Pragma’: ‘public’, ‘Expires’: ‘0’, ‘Cache-Control’: ‘private, must-revalidate, post-check=0, pre-check=0’, ‘Content-disposition’: ‘attachment; filename="’ + zippedFilename + ‘"’, ‘Transfer-Encoding’: ‘chunked’, ‘Content-Transfer-Encoding’: ‘binary’};res.writeHead(200, header);archive.store = true;archive.pipe(res);list.map(item => { fileCounter++; let inStream = request.get(item.downLoadUrl); let name = item.fileName; let length = 0; inStream.on(‘response’, function(awsData) { archive.append(inStream, { name: name }); }).on(‘data’, function(data) { length += data.length; }).on(’error’, function(e) { console.error(name + ‘-error’, e); }).on(’end’, function(endData) { fileCounter–; if (fileCounter < 1) { archive.finalize(); } });});archive.on(’error’, function(err) { throw err;});archive.on(‘finish’, function(err) { return res.end();});……当然中间还有些细节需要处理:比如中文文件名的问题,是否需要下载文件总大小做限制,是否会出现文件不存在等等情况。 ...

March 15, 2019 · 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

Java实现下载文件到本地

需求导出文件后存留在了服务器中,需要提供下载按钮,点击后可下载到本地;(因为涉及多个文件,下载前先将文件进行压缩,提供下载压缩文件)效果预览代码主要方法/** * 下载生成的所有在线/离线用户信息表格 * @param request * @param response * @return 压缩文件 * @throws FTPConnectionClosedException * @throws IOException */ public File downloadExcel (HttpServletRequest request, HttpServletResponse response) throws FTPConnectionClosedException, IOException { //提供下载文件前进行压缩,即服务端生成压缩文件 File file = new File(zipPath); FileOutputStream fos = new FileOutputStream(file); ZipUtils.toZip(path, fos, true); //1.获取要下载的文件的绝对路径 String realPath = zipPath; //2.获取要下载的文件名 String fileName = realPath.substring(realPath.lastIndexOf(File.separator)+1); response.reset(); response.setCharacterEncoding(“UTF-8”); response.setContentType(“application/octet-stream”); //3.设置content-disposition响应头控制浏览器以下载的形式打开文件 response.addHeader(“Content-Disposition”,“attachment;filename=” + new String(fileName.getBytes(),“utf-8”)); //获取文件输入流 InputStream in = new FileInputStream(realPath); int len = 0; byte[] buffer = new byte[1024]; OutputStream out = response.getOutputStream(); while ((len = in.read(buffer)) > 0) { //将缓冲区的数据输出到客户端浏览器 out.write(buffer,0,len); } in.close(); return file; }压缩方法[1] public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) throws RuntimeException{ long start = System.currentTimeMillis(); ZipOutputStream zos = null ; try { zos = new ZipOutputStream(out); File sourceFile = new File(srcDir); compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure); long end = System.currentTimeMillis(); System.out.println(“压缩完成,耗时:” + (end - start) +" ms"); } catch (Exception e) { throw new RuntimeException(“zip error from ZipUtils”,e); }finally{ if(zos != null){ try { zos.close(); } catch (IOException e) { e.printStackTrace(); } } } } * 递归压缩方法 * @param sourceFile 源文件 * @param zos zip输出流 * @param name 压缩后的名称 * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) * @throws Exception / private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure) throws Exception{ byte[] buf = new byte[BUFFER_SIZE]; if(sourceFile.isFile()){ // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 zos.putNextEntry(new ZipEntry(name)); // copy文件到zip输出流中 int len; FileInputStream in = new FileInputStream(sourceFile); while ((len = in.read(buf)) != -1){ zos.write(buf, 0, len); } // Complete the entry zos.closeEntry(); in.close(); } else { File[] listFiles = sourceFile.listFiles(); if(listFiles == null || listFiles.length == 0){ // 需要保留原来的文件结构时,需要对空文件夹进行处理 if(KeepDirStructure){ // 空文件夹的处理 zos.putNextEntry(new ZipEntry(name + “/”)); // 没有文件,不需要文件的copy zos.closeEntry(); } }else { for (File file : listFiles) { // 判断是否需要保留原来的文件结构 if (KeepDirStructure) { // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠, // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了 compress(file, zos, name + “/” + file.getName(),KeepDirStructure); } else { compress(file, zos, file.getName(),KeepDirStructure); } } } } }SpringMVC@Download @Path(“downloadExcel”) public File DownloadExcel(HttpServletRequest request, HttpServletResponse response) throws FTPConnectionClosedException, IOException { File file = exportXMPPUserInfo.downloadExcel(request, response); return file; }前端公司内部写法,理解其中含义即可。 … <input id=“downloadExcel” type=“submit” value=“下载” /> … <script> … //下载excel W.$(‘downloadExcel’).on(‘click’,function(e){ W.download(‘userLoginService/downloadExcel’); / W.get(‘userLoginService/downloadExcel’).done(function(result){ console.log(“下载用户信息表”); }); */ }); …</script>引用[1] https://www.cnblogs.com/zeng1… Java实现将文件或者文件夹压缩成zip ...

December 14, 2018 · 2 min · jiezi