XMLHttpRequest Level 2 轻松Ajax上传

XMLHttpRequest Level 2 轻松Ajax上传

  • 记得在XMLHttpRequest Level 1时,实现ajax上传,就用隐藏的iframe实现,而且功能也受限。
  • XMLHttpRequest Level 2中,可以轻松实现,下面以实例开始。

前端jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<Meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>第二代XmlHttpRequest异步上传</title>
		<script type="text/javascript">
			function upload(){
				if (!window.FormData){
					alert('您的浏览器不支持第二代XmlHttpRequest');
					return;
				}
				// HTML5 新增对象
				var formData = new FormData(document.getElementById('uploadForm'));
				//添加其他表单域
				formData.append('user','haolin');
				formData.append('pass','111111');
				
				var xhr = new XMLHttpRequest();
				xhr.open('POST','upload'); //请求url
				
				//上传完成回调函数
				xhr.onload = function(event) {
					if (xhr.status === 200) {
						alert("上传成功");
					} else {
						alert('出错了');
					}
				};
				xhr.send(formData);
			}
		</script>
	</head>
	<body>
		<h1>第二代XmlHttpRequest对象实现异步上传</h1>
		<form id="uploadForm" action="" method="post" enctype="multipart/form-data">
			<input id="upfile" type="file" name="upfile"/>
			<input type="button" value="上传" onclick="upload()"/> 
		</form>
	</body>
</html>

后端部分代码(基于apache commons upload):

PrintWriter out = new PrintWriter(response.getoutputStream());
FileItemFactory factory = new diskFileItemFactory();// 为该请求创建一个diskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items;
try {
items = upload.parseRequest(request);
Iterator<FileItem> itr = items.iterator();
while (itr.hasNext()) {
	FileItem item = (FileItem) itr.next();
	System.out.println("是否是FormField: " + item.isFormField());
	System.out.println("接收到域: " + item.getFieldName());
	System.out.println("接收到值: " + item.getString("utf-8"));
	// 检查当前项目是普通表单项目还是上传文件。
	if (item.isFormField()) {// 如果是普通表单项目,显示表单内容。
		String fieldName = item.getFieldName();
		out.println("the field name is " + fieldName);// 显示表单域名称。
} else {// 如果是上传文件显示文件名。
		out.println("the upload file name is " + item.getName());
	} 
}
out.flush();
out.close();
} catch (FileUploadException e) {
    e.printstacktrace();
}

对上述Ajax上传进行了简单的封装:

var AjaxForm = function(cfg){
	if (!window.FormData){
		alert("Sorry,your browser doesn't supoort FormData!");
	}
	
	/**
	 * null or undefined 返回true,否则false
	 */
	this.isNullOrUndefined = function(v,errMsg){
		if (!v){
			alert(errMsg);
			return true;
		}
		return false;
	};
	
	var cfg = cfg || {};
	if (this.isNullOrUndefined(cfg.id,"id can't be empty")) return;
	if (this.isNullOrUndefined(cfg.url,"url can't be empty")) return;
	
	this.id = cfg.id; // 表单id
	this.method = cfg.method || "POST"; //认POST方法
	this.url = cfg.url;
	this.async = !cfg.sync; //同步否
	this.resultType = cfg.resultType || "text"; //返回结果类型 json对象或text
	this.formData = new FormData(document.getElementById(this.id)); //form数据
	this.xhr = new XMLHttpRequest(); //当前请求对象
	
	/**
	 * 超时事件
	 * 配置格式:
	 *   timeout : xxx,*   onTimeout: function(event){}
	 */
	if (cfg.timeout){ 
		this.xhr.timeout = cfg.timeout;
		this.xhr.ontimeout = cfg.onTimeout;
	}
	
	/**
	 * 发送过程事件
	 * 配置格式: 
	 * onProgress: function(loaded,total){}
	 */
	if (cfg.onProgress){ //发送数据过程
		this.xhr.upload.onprogress = function(e){
			if (e.lengthComputable) {
				cfg.onProgress(e.loaded,e.total);
			}
		};
	}
	
	/**
	 * 上传完成事件
	 */
	if (cfg.onComplete){
		this.xhr.onload = function(event){
			var res = event.target.responseText;
			if (this.resultType === 'json'){
				if ((typeof JSON) === 'undefine'){
					res = eval("("+res+")");
				} else{
					res = JSON.parse(res);
				}
			}
			cfg.onComplete(res);
		};
	}
	
	/**
	 * 发出请求
	 */
	this.request = function(){
		this.xhr.open(this.method,this.url,this.async);
		this.xhr.send(this.formData);
	};
};

调用实例:

var af = new AjaxForm({
	id: "uploadForm",url: 'upload',method: 'POST',timeout: 5000,onTimeout: function(event){
		alert('It is timeout.');
	},onProgress: function(loaded,total){
		var complete = (loaded / total * 100 | 0);
		var progress = document.getElementById('uploadProgress');
		progress.value = complete;
		progress.innerHTML = complete;
	},onComplete: function(result){
		alert(result);
	}
});
af.request();

不吝指正。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但是在某些特殊情况下,我们可能还需要使用IE6来访问网页。而在IE6中,我们通常会使用JavaScript来提交表单,来看一下具体操作。
PHP中的count()函数是用来计算数组或容器中元素的个数。这个函数十分方便,在编写代码时使用频率也非常高。无论你是要统计数组的长度、统计字符串中字符出现的次数还是统计对象中属性的个数,count()都可以帮助你轻松
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不刷新整个页面的情况下,向服务器发送请求并接收响应。通常来说,我们使用 AJAX 请求是为了获取后台数据,并将其展示在前端页面上。然而,有时候我们只需要
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页用户体验的技术,通过与服务器进行异步通信,实现在网页上局部刷新数据而不必整个页面刷新的功能。在实际开发中,我们经常需要从服务器端下载文件,而传统
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以在不刷新整个页面的情况下,向服务器发送请求并获取响应数据。在某些场景下,我们需要通过AJAX下载Excel文件流,以便于在前端使用或保存到本地。本文将详
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax,我们可以在不刷新整个页面的情况下向服务器发送请求并获得响应数据。而在Ajax的基础上,.get和.post是两种常用的请求方法,它们分别用于发送GET和POST请
AJAX(Asynchronous JavaScript and XML)是一种在网页上实现异步数据传输的技术。通过AJAX,网页可以在不刷新整个页面的情况下与服务器进行数据交互,提升用户体验和页面性能。在实际应用中,AJAX广泛用于表单提交、
在使用Ajax下拉加载数据的过程中,有时候会出现无法取到360度的问题。这个问题可能是由于代码逻辑的问题导致的,也有可能是网络延迟引起的。为了解决这个问题,我们需要对代码进行仔细排查,并且在合适的地方添加适当
本文将介绍Ajax和.post之间的区别。Ajax是一种用于在网页上进行异步通信的技术,能够在不刷新整个页面的情况下更新部分页面内容。.post是jQuery中的一个方法,用于向服务器发送POST请求。虽然它们都可以用于发送异步
AJAX(Asynchronous JavaScript and XML)是一种在Web页面上进行异步数据请求和交互的技术。它的出现使得页面在后台与服务器进行数据交互的同时,不需要重新加载整个页面。在网页开发中,常常需要实现文件上传功能,
最近,我对于在IE浏览器中使用Ajax上传文件进行了一番研究。我发现IE浏览器对于Ajax上传文件提供了支持,并且使用起来也相对简单。事实上,我们可以使用ActiveXObject对象来实现在IE浏览器中上传文件的功能。
AJAX是一种用于在不重新加载整个网页的情况下从服务器异步传输数据的技术。它允许我们通过JavaScript与服务器进行通信,并在网页上实现动态更新。然而,在使用AJAX时,我们可能遇到跨域问题。跨域是指在浏览器中,
当涉及与跨域请求相关的Ajax开发时,我们通常会选择使用POST方法。然而,有时我们会不得不面对无法使用POST方法发送Ajax请求的情况。本文将会深入探讨造成这种限制的原因,并提供一些常见且解决此问题的方法。
Python是一种常用的编程语言,它可以用来开发各种各样的应用程序。其中,猜数字游戏算得分是Python初学者非常适合的练习项目之一。
AJAX(Asynchronous JavaScript and XML)指的是一种在客户端和服务器之间进行异步数据交互的技术,它可以在不影响页面加载速度的情况下,实现与服务器的数据交互,并动态更新页面内容。通过AJAX,用户可以在不刷新整
AJAX 是一种用于在后台与服务器进行异步通信的技术。它能够实现在不刷新整个页面的情况下,通过后台发送请求并将响应返回到前端。然而,有时候在使用 AJAX 上传文件时会出现错误 7。本文将探讨这个错误的原因,并提
在现代网页开发中,Ajax 技术的应用日益广泛。其中,Ajax 下拉菜单 slide(下拉菜单的滑动效果)是一种常见且有趣的交互方式。通过使用 Ajax 技术实现下拉菜单 slide,可以为用户提供更好的用户体验,同时也能增加网
AJAX(Asynchronous JavaScript and XML)是一种常用的Web开发技术,它通过异步通信方式实现了与服务器的数据交互。在AJAX中,我们可以使用HTTP协议发送请求到服务器并获取响应。然而,有时候我们需要在请求中传递一
Python是一门非常流行的编程语言,近年来它的受欢迎度一直在不断地提高。在Python的使用者中还有一位特别的粉丝,他就是我们的歌手王力宏。
在前端开发中,使用Ajax来进行文件下载是一种常见的方法。通过Ajax可以实现在不刷新整个页面的前提下,向服务器发送请求并接收返回的文件数据。然而,当文件较大或者下载过程比较耗时时,我们可能需要提供一些提示或