通过AJAX监控文件上传进度

### 通过 AJAX 监控文件上传进度 在 Web 开发中,文件上传是常见的功能之一。传统的文件上传机制是基于 HTTP 协议的表单提交,即用户通过 `<input type="file">` 选择文件后,整个表单或文件被一次性发送到服务器。这种方式虽然简单易用,但在文件较大的情况下,用户体验较差,尤其是在早期的 Internet Explorer 浏览器上,可能出现浏览器卡顿、无响应等问题。 为了解决这些问题,可以利用 AJAX 技术来监控文件上传的进度,并给予用户及时的反馈。下面将详细介绍如何实现这一功能。 #### 使用标准的文件上传方式 我们保留传统的文件上传方式,即使用 `<input type="file">` 元素来让用户选择文件。这是因为直接使用 AJAX 进行文件上传会遇到较多问题,如浏览器兼容性、跨域限制等。因此,我们采取折中的方案:先通过标准方式上传文件,再借助 AJAX 技术实时获取上传进度。 #### 实现 AJAX 进度监控 1. **创建 XMLHttpRequest 对象**: - 根据不同的浏览器环境,创建 XMLHttpRequest 或 ActiveXObject 对象。这是因为旧版的 IE 浏览器并不支持 XMLHttpRequest,而是使用 ActiveXObject 来实现类似的功能。 ```javascript function getXMLHttpRequest() { var http_request; if (window.XMLHttpRequest) { // 非 IE 浏览器 http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/xml'); } } else if (window.ActiveXObject) { // IE 浏览器 try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e1) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { // IE 不支持 XMLHttpRequest } } } return http_request; } ``` 2. **定义 AJAX 请求函数**: - 定义一个函数 `sendGetDictate` 用于发送 AJAX 请求。 ```javascript function sendGetDictate(http_request, url) { http_request.open("GET", url, true); http_request.send(null); } ``` 3. **定时检查上传状态**: - 使用 `setTimeout` 函数每隔一段时间(例如 500 毫秒)调用 `checkupload` 函数,该函数负责发送 AJAX 请求并处理返回的结果。 ```javascript function checkupload() { req = getXMLHttpRequest(); req.onreadystatechange = setActiveContent; sendGetDictate(req, "/manager/servlet/imageservlet?tag=ajaxuploadfilecheck&WARE_ID=609187669&nocache=" + Math.random(), "name=111"); } ``` 4. **处理服务器响应**: - 当服务器返回数据时,根据返回的状态码执行相应的操作。这里使用了一个变量 `count` 来控制循环次数,防止无限循环。 ```javascript var count = 0; // 控制循环次数 function setActiveContent() { if (req.readyState == 4) { if (req.status == 200) { var rettext = req.responseText; // 获取服务器返回的内容 if (rettext == "-1") { alert("停止循环"); } else if (rettext == "0") { if (count < 6) { setTimeout("checkupload()", 500); count++; } else { alert("上传失败"); } } else if (rettext == "1") { alert("文件上传成功"); } } } } ``` #### 总结 通过上述步骤,我们可以实现在文件上传过程中实时显示上传进度的效果。这种方法不仅提高了用户体验,而且减少了因文件上传过程中的不确定因素而引发的问题。同时,由于采用了传统的文件上传方式与 AJAX 结合的方式,避免了许多直接使用 AJAX 上传文件可能遇到的技术难题。


















--sunfruit
很多时候需要上传附件到服务器,一般采用在页面放置<input type="file" name="upload" value=""> 的方式让用户选择要上传的文件进行上传,使用的是HTTP协议,这样的方式很方便开发也简单,不过如果上传的附件比较大的时候,会出现IE响应很慢的情况,如果用户急性子,多点几下上传的按钮,那么就会导致IE不响应的情况,这个时候如果在文件上传得过程中,给用户一个动态的提示甚至是一个上传的进度条,效果就会好多了,这样就会用到Ajax技术了,让Ajax以一个固定的间隔时间检查上传情况然后在页面以文字或是图片的方式体现出来就行了。
在使用Ajax进行附件上传进度查询的时候也想过,直接使用Ajax进行附件上传,在实现过程中发现问题比较多,所以就使用了变通的方式:使用标准的附件上传方式,结合Ajax进行上传的进度检查
主要的代码如下:
Ajax的封装
/**
* 创建 XMLHttpRequest 对象
*/
function getXMLHttpRequest()
{
var http_request;
if (window.XMLHttpRequest) {
//非IE浏览器框架创建 XMLHttpRequest 对象
http_request = new XMLHttpRequest();
if(http_request.overrideMimeType)
{
http_request.overrideMimeType('text/xml');
}
}else if (window.ActiveXObject){
// 创建 XMLHttpRequest 对象
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e1) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
// 不能创建 XMLHttpRequest 对象
}

- madj2012-12-26可以使用,谢谢分享

- 粉丝: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 多层神经网络专家讲座.pptx
- 网络营销渠道策略PPT.pptx
- Thor-AI人工智能资源
- 数据库课程设计图书馆管理系统.doc
- 网络教研个人年度工作计划.doc
- 2021新年网络寄语文案大全.docx
- 网络公司年度计划.doc
- 史丰收速算法特点.pdf
- 电力系统中基于二阶锥优化的配电网电压控制研究及Matlab实现
- Oracle-APEX开发指南.doc
- 在建工程如何项目管理.docx
- 最小生成树算法讲解PPT课件.ppt
- premiere电子教案.docx
- 异步电机直接转矩控制算法模型及其R2016b以上版本的运行指南 最新版
- 家居建材行业如何做好网络营销.doc
- 移动信息化解决方案助力中小企业.doc


