搜索
首页web前端js教程使用Blod做出ajax的进度条下载

这次给大家带来使用Blod做出ajax的进度条下载,使用Blod做出ajax的进度条下载的注意事项有哪些,下面就是实战案例,一起来看一下。

普通的浏览器下载

在web开发中,如果要实现下载功能,往往都是使用新开web页面或者是使用iframe的形式。实现起来其实很简单:

<a target="_blank" href="download.zip" rel="external nofollow" >点击下载</a>
//或者
<iframe style="display:none" src="download.zip"></iframe>

用户点击a标签弹出一个新页签后,或者是打开了iframe后,浏览器就会接受一个下载响应,并下载附件。其实所谓附件下载,就是在浏览器读到响应报文的头之后,浏览器生成一个下载提示框,在用户确定后会继续下载文件。文件其实就是个流,所谓流就是一个传输的过程,浏览器会自动管理这个传输过程,会自动生成进度条、停止下载按钮、继续继续按钮、取消下载按、显示更新下载的字节数钮等。这些都是浏览器自动为我们做的,整个过程不受我们控制。

ajax下载

浏览器对下载的支持基本上已经能满足我们的需求,一般场景下再探索其他下载方式意义不大。但是还是有些场景是浏览器下载不能满足的,比如要求我们的web应用对下载进度的进行监控,或者下载完成后触发特定事件,或者web应用可以自动取消下载过程,或者使用worker创建一个后台运行的下载等等。对于以上情况我们都可以采用基于Blod对象的ajax下载。

ajax下载附件和ajax上传附件一样,需要浏览器支持ajax2.0。其实所谓下载和和普通的ajax请求没什么区别,都是对一个url地址做请求,但是下载一般都是二进制文件,不是文本对象或者json对象,需要JavaScript提供一个对够封装这个二进制文件的类型,这就是blod。因此要设置响应的类型responseType的值为“blod”:

var xhr =new XMLHttpRequest();
xhr.open(option.type ? option.type.toUpperCase() : 'GET', url, true);
xhr.responseType = 'blob';

要求XMLHttpRequest对象的responseType字段值是blob。那么blod对象又是什么?

blod对象

MDN对其描述为:

Blob对象是包含有只读原始数据的类文件对象。Blob对象中的数据并不一定得是JavaScript 中的原生形式。File接口基于 Blob,继承了Blob的功能,并且扩展支持用户计算机上的本地文件。通过Blob对象我们可以将一个二进制流封装为一个对象。

如果你了解过html5的file相关的api,你对于blod对象应该不会是陌生。blod能够把一个字节流封装为一个文件,将XMLHttpRequest对象的responseType值是blob,我们可以把响应体当做是一个blob对象处理。

xhr.onload = function () {
  //对于重定向的文件不予理会
  if (this.status >= 200 && this.status < 300) {
    var blob = new Blob([this.response], {type: this.response.type});
  }
}

使用ajax下载文件,再将文件保存为blob对象,缓存在浏览器中。那么如何让用户将文件保存到硬盘上呢?

将blob对象保存在硬盘上

我们可以效仿浏览器下载,生成一个a标签或者iframe,再生成一个url,这样就回到了浏览器下载了,浏览器会自动生成一个保存附件的窗口。url可以使用URL.createObjectURL(blob)方法获得,URL.createObjectURL支持Blob对象和File对象,能够生成一个虚拟的url使当前用户可以访问到这些对象,当然也包括下载。不同于直接从服务器下载,这里的下载是客户端内部的,不走网络io,所以下载几乎是瞬时的。不过生成完这个url后,还要将其释放,否则blob资源不会被垃圾回收,使用URL.revokeObjectURL就可以释放掉这个url,让blob资源释放。对于ie浏览器,有自己的一套Blob对象处理策略,就是msSaveOrOpenBlob和msSaveBlob两个navigator方法。

//ie的下载
if (window.navigator.msSaveOrOpenBlob) {
  navigator.msSaveBlob(blob, fileName);
} else {
  //非ie的下载
  var link = document.createElement('a');
  link.href = window.URL.createObjectURL(blob);
  link.download = fileName;
  link.click();
  window.URL.revokeObjectURL(link.href);
}

进度条和取消下载

然后就是进度条和下载取消功能了,其实XMLHttpRequest对象是有个progress事件的,只是我们平时做ajax请求的时候都忽略他,毕竟一般请求都是瞬时的,不需要为其设置进度条。但是ajax下载却不一样,下载附件是需要时间的,因此为其开发个进度条还是很有必要的,监听progress事件,我们就可以获取下载进度。

使用XMLHttpRequest对象的abort函数可以取消下载,此外load事件可以监听到下载完成,error事件可以监听到下载失败。总之,ajax下载和一个普通的ajax请求的事件和方法是完全一样的。

性能优化和同源策略

ajax下载和长连接一样,会比普通请求占用更多带宽,尤其下载对带宽占用更是严重。因此下载过程中可能会阻塞其他的ajax请求,所以建议ajax下载的资源和其他请求的资源使用不同的域名,但是这样又会带来新的问题——同源策略问题。

同源策略是浏览器安全的基石,如果没有同源策略随便一个网站都可以发出csrf攻击。如果不能保证下载的资源的url和当前页面的url同源,就会触发同源策略导致下载失败,因此需要做ajax跨域处理。相比iframe和新页签的下载方法(事实上iframe也有同源策略,要求iframe里面的页面和父页面不能访问对方的内容,但是下载功能不涉及这种访问对方的内容操作,所以iframe下载是不受同源策略影响的),ajax下载本质上还是ajax,因此会受到浏览器同源策略的影响。所以如果下载非同源的附件,就需要附件所在的服务器支持cors,如果服务器需要访问cookie,还要将XMLHttpRequest对象的withCredentials设置为true。

同时出于同源策略的原因,我们不能使用ajax的形式去下载第三方资源,因为通常的下载服务都不会做cors处理的,比竟iframe下载或者新页签下载的方式是不受同源策略影响的,所以无需做cors处理。这大大限制了ajax下载的适用度。

总结:

最后我们再总结一下ajax下载的使用场景:

1.需求对下载进度的进行监控的场景,比如发现用户下载进度过慢,主动提供其他解决方案。

2.需要下载完成后触发特定事件,例如弹出一个桌面提示Notification。

3.需要提供一个后台下载。例如我们可以在用户打开网页后将附件偷偷地下载下来再缓存起来,等到用户真的想下载附件时候直接保存在本地。我们甚至可以借助worker创建一个后台线程,从而还能保证下载过程不会影响页面正常渲染。

4.需要下载后不保存在硬盘中,而是webapp直接处理附件。例如pdf.js,就是采用的ajax下载。

最后奉上笔者的一个ajax下载的demo:ajaxDownloadDemo_jb51.rar

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

C与View之间怎么进行数据交流

前端与后端有哪几种ajax交互方法

以上是使用Blod做出ajax的进度条下载的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Scrapy基于Ajax异步加载实现方法Scrapy基于Ajax异步加载实现方法Jun 22, 2023 pm 11:09 PM

Scrapy是一个开源的Python爬虫框架,它可以快速高效地从网站上获取数据。然而,很多网站采用了Ajax异步加载技术,使得Scrapy无法直接获取数据。本文将介绍基于Ajax异步加载的Scrapy实现方法。一、Ajax异步加载原理Ajax异步加载:在传统的页面加载方式中,浏览器发送请求到服务器后,必须等待服务器返回响应并将页面全部加载完毕才能进行下一步操

如何使用CakePHP中的AJAX?如何使用CakePHP中的AJAX?Jun 04, 2023 pm 08:01 PM

作为一种基于MVC模式的PHP框架,CakePHP已成为许多Web开发人员的首选。它的结构简单,易于扩展,而其中的AJAX技术更是让开发变得更加高效。在本文中,将介绍如何使用CakePHP中的AJAX。什么是AJAX?在介绍如何在CakePHP中使用AJAX之前,我们先来了解一下什么是AJAX。AJAX是“异步JavaScript和XML”的缩写,是指一种在

jquery ajax报错403怎么办jquery ajax报错403怎么办Nov 30, 2022 am 10:09 AM

jquery ajax报错403是因为前端和服务器的域名不同而触发了防盗链机制,其解决办法:1、打开相应的代码文件;2、通过“public CorsFilter corsFilter() {...}”方法设置允许的域即可。

ajax传递中文乱码怎么办ajax传递中文乱码怎么办Nov 15, 2023 am 10:42 AM

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。详细介绍:1、设置统一的编码方式,确保服务器端和客户端使用相同的编码方式,通常情况下,UTF-8是一种常用的编码方式,因为它可以支持多种语言和字符集;2、服务器端编码,在服务器端,确保将中文数据以正确的编码方式进行编码,再传递给客户端等等。

Nginx中404页面怎么配置及AJAX请求返回404页面Nginx中404页面怎么配置及AJAX请求返回404页面May 26, 2023 pm 09:47 PM

404页面基础配置404错误是www网站访问容易出现的错误。最常见的出错提示:404notfound。404错误页的设置对网站seo有很大的影响,而设置不当,比如直接转跳主页等,会被搜索引擎降权拔毛。404页面的目的应该是告诉用户:你所请求的页面是不存在的,同时引导用户浏览网站其他页面而不是关掉窗口离去。搜索引擎通过http状态码来识别网页的状态。当搜索引擎获得了一个错误链接时,网站应该返回404状态码,告诉搜索引擎放弃对该链接的索引。而如果返回200或302状态码,搜索引擎就会为该链接建立索引

什么是ajax重构什么是ajax重构Jul 01, 2022 pm 05:12 PM

ajax重构指的是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更合理,提高软件的扩展性和维护性;Ajax的实现主要依赖于XMLHttpRequest对象,由于该对象的实例在处理事件完成后就会被销毁,所以在需要调用它的时候就要重新构建。

在Laravel中如何通过Ajax请求传递CSRF令牌?在Laravel中如何通过Ajax请求传递CSRF令牌?Sep 10, 2023 pm 03:09 PM

CSRF代表跨站请求伪造。CSRF是未经授权的用户冒充授权执行的恶意活动。Laravel通过为每个活动用户会话生成csrf令牌来保护此类恶意活动。令牌存储在用户的会话中。如果会话发生变化,它总是会重新生成,因此每个会话都会验证令牌,以确保授权用户正在执行任何任务。以下是访问csrf_token的示例。生成csrf令牌您可以通过两种方式获取令牌。通过使用$request→session()→token()直接使用csrf_token()方法示例<?phpnamespaceApp\Http\C

使用HTML5文件上传与AJAX和jQuery使用HTML5文件上传与AJAX和jQuerySep 13, 2023 am 10:09 AM

当提交表单时,捕获提交过程并尝试运行以下代码片段来上传文件-//File1varmyFile=document.getElementById(&#39;fileBox&#39;).files[0];varreader=newFileReader();reader.readAsText(file,&#39;UTF-8&#39;);reader.onload=myFunc;functionmyFunc(event){&nbsp;&nbsp;varres

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具