博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XMLHttpRequest Level 2 轻松Ajax上传
阅读量:6320 次
发布时间:2019-06-22

本文共 3379 字,大约阅读时间需要 11 分钟。

hot3.png

XMLHttpRequest Level 2 轻松Ajax上传:

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

前端jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"	pageEncoding="UTF-8"%>			
第二代XmlHttpRequest异步上传

第二代XmlHttpRequest对象实现异步上传

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

PrintWriter out = new PrintWriter(response.getOutputStream());FileItemFactory factory = new DiskFileItemFactory();// 为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。ServletFileUpload upload = new ServletFileUpload(factory);List
items;try {    items = upload.parseRequest(request);    Iterator
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();

不吝指正。

转载于:https://my.oschina.net/indestiny/blog/215472

你可能感兴趣的文章
三十秒的小习惯,一辈子的大影响
查看>>
Zookeeper配置文件
查看>>
通过闭包避免递归过程中的重复计算
查看>>
Java学习从入门到精通(附FAQ)
查看>>
[转载] 故宫第三集 礼仪天下(下)
查看>>
[转载] 七龙珠第一部——第076话 庐山真面目
查看>>
[转载] C#面向对象设计模式纵横谈——1. 面向对象设计模式与原则
查看>>
一步步学习EF Core(1.DBFirst)
查看>>
《团队-科学计算器-开发环境搭建过程》
查看>>
Centos 7 上安装使用 vscode
查看>>
Can you solve this equation? 详细解答
查看>>
ComboBox的数据绑定
查看>>
CF 633 E. Binary Table
查看>>
模式识别,计算机视觉领域,期刊
查看>>
Maven工程搭建spring boot+spring mvc+JPA
查看>>
软件开发目录规范
查看>>
codevs 1269 匈牙利游戏——次短路(spfa)
查看>>
poj2728 最小比率生成树——01分数规划
查看>>
汕头市队赛 SRM10 dp只会看规律 && bzoj1766
查看>>
python_元组、字典
查看>>