利用XMLHttpRequest实现文件上传

微软最早以ActiveX对象的形式在IE5中引入了XMLHttpRequest对象,经Google发扬光大之后,目前所有的浏览器都已经支持XMLHttpRequest了,目前W3C正在制定XMLHttpRequest Level 2标准草案,相对于原来的XMLHttpRequest,新标准的XMLHttpRequest有了很大的改进,提供了很多新的功能。

本文就新旧XMLHttpRequest对象进行一个简单的比较,并介绍新标准的XMLHttpRequest对象的改进之处。

原来的XMLHttpRequest对象的缺点:

1.只支持文本数据的传递,不支持二进制数据。

2.传递数据的时候,没有progress事件,不能实时显示传递的进度信息。

3.受同源策略的限制,不能发送跨域的请求。

新标准的XMLHttpRequest的改进:

1.可以传递二进制数据。

2.在服务器端设置了允许跨域请求的时候,可以获取跨域的数据。

3.可以使用原生的FormData对象来管理要发送的表单数据。

4.提供了progress事件,可以提供进度信息。在下载和上传的时候,都有progress事件,下载的时候,progress事件由XMLHttpRequest本身触发,上传的时候,由XMLHttpRequest.upload对象触发。

利用新标准的XMLHttpRequest对象,我们可以非常方便的实现文件AJAX上传功能。

HTML:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
	<meta charset="UTF-8">
	<title>File Upload using XMLHttpRequest</title>
	<style type="text/css">
	.container {
        width: 500px;
        margin: 0 auto;
    }
    .progress-bar {
        border: 1px solid #000;
    }
    .progress {
        width: 0;
        background: #DEDEDE;
        height: 20px;
    }
	</style>
</head>
<body>
	<div class="container">
		<p>
			选择文件:
			<input type="file" id="ipt-file"/>
			<button type="button" id="btn-upload">上传</button>
		</p>
		<div class="progress-bar">
			<div class="progress"  id="progress"></div>
		</div>         <p id="info"></p>
	</div>
	<script src="./js/upload.js"></script>
</body>
</html>

JavaScript:

upload.js的具体代码如下:

var button = document.querySelector("#btn-upload"),
	input = document.querySelector("#ipt-file"),
	progress = document.querySelector("#progress"),
	info = document.querySelector("#info");

var upload = function() {
	if (input.files.length === 0) {
		console.log("未选择文件");
		return;
	}

	var formData = new FormData();
	formData.append("file", input.files[0]);

	var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function() {
		if (xhr.readyState === 4) {
			console.log(xhr.responseText);
			info.innerHTML = xhr.responseText;
		}
	};

	xhr.upload.addEventListener("progress", function(event) {
		progress.style.width = Math.ceil(event.loaded * 100 / event.total) + "%";
	}, false);

	xhr.open("POST", "./upload");
	xhr.send(formData);
};

button.addEventListener("click", upload, false);

Java: 

上传服务端采用Servlet来实现。

package com.servlet;

import java.io.File;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet(description = "文件上传", urlPatterns = { "/upload" })
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private String filePath;
	private int maxFileSize = 1024 * 1024;

	public void init() {
		filePath = this.getServletContext().getRealPath("/") + File.separator
				+ "upload";
		File file = new File(filePath);
		if (!file.exists()) {
			file.mkdirs();
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, java.io.IOException {
		response.setContentType("text/plain");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setSizeMax(maxFileSize);

		try {
			List fileItems = upload.parseRequest(request);
			Iterator i = fileItems.iterator();
			while (i.hasNext()) {
				FileItem fi = (FileItem) i.next();
				if (!fi.isFormField()) {
					String fileName = fi.getName();
					File file = new File(filePath + File.separator + fileName);
					fi.write(file);
					out.println(fileName + "上传成功");
				}
			}
		} catch (Exception ex) {
			out.println("上传文件失败:" + ex.getMessage());
		} finally {
			out.close();
		}
	}
}

  

  

  

时间: 2024-10-04 13:27:34

利用XMLHttpRequest实现文件上传的相关文章

利用Spring处理文件上传

文件上传有很多中方式,之前写过一个利用DiskFileItemFactory实现文件上传的例子,这次项目中使用了新的方式,通过MultipartHttpServletRequest来获取文件流,下面是我的一个DEMO: 输出方式一: <span style="white-space:pre"> </span>//对request进行包装 MultipartHttpServletRequest multipartRequest = (MultipartHttpSe

简单利用filetype进行文件上传

对于文件上传大家都很熟悉了,毕竟文件上传是获取webshell的一个重要方式之一,理论性的东西参考我的另一篇汇总文章<浅谈文件解析及上传漏洞>,这里主要是实战补充一下理论内容--filetype漏洞! filetype漏洞主要是针对content-type字段,主要有两种利用方式:    1.先上传一个图片,然后将content-type:image/jpeg改为content-type:text/asp,然后对filename进行00截断,将图片内容替换为一句话木马. 2.直接使用burp抓

selenium+java利用AutoIT实现文件上传

1.AutoIT介绍 AutoIT是一个类似脚本语言的软件,利用此软件我们可以方便的实现模拟键盘.鼠标.窗口等操作,实现自动化. 2.实现原理 利用AutoIT编写合适的脚本,然后将脚本编译成可执行文件,在自动化实现时,直接调用此脚本实现文件上传. 备注:编写脚本和编译,需要借助AutoIT提供的工具,但是脚本编译成可执行文件后,可以直接使用,不再需要安装AutoIT. 3.自动化调用 AutoIT脚本编译成可执行文件后,放到本地的某一个目录下 自动化实现过程中,需要上传图片时,首先定位到[上传

Java 利用 SWFUpload多文件上传 session 为空失效,不能验证的问题

原文转自:http://www.tqcto.com/article/code/295299.html 我们都知道普通的文件上传是通过表单进行文件上传的,还不能达到异步上传的目的.通过使用某些技术手段,比如jquery form.js可以达到异步上传的目的,但最重要的问题在于,它不能够进行多个文件的上传.如果你要上传多个文件,必须一个一个地上传,同时还要在界面上处理当上传完一个文件之后,下一个文件上传框的问题.    现在我们有了一个更多的运行,即使用swfupload进行多文件异步上传.顾名思义

java网络编程(7)——利用tcp实现文件上传

其实客户端与服务端通讯的道理都是一样的,都是通过输入与输出这两个流,那么实现文件上传也就是同样的,客户端把文件读到文件流,服务端用文件流来接受,然后写到一个文件中,这样子就实现了文件上传,文件拷贝也是同样的道理~,具体看代码实现: 客户端: package com.seven.tcp; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStre

spring mvc利用MultipartResolver解析Multipart/form-data进行文件上传

之前的表单数据都是文本数据,现记录:利用MultipartResolver进行文件上传. ①首先,需引入commons-fileUpload和commons-io jar包,pom.xml文件的坐标: <properties>      <spring.version>3.2.1.RELEASE</spring.version>  </properties>  <dependencies>          <dependency> 

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器控件提供了很简单的上传,但是有回传,还没有进度条提示.这次我们演示利用swfupload多文件上传,项目上文件上传是比不可少的,大家这个心里都知道.主要提供给源码说明及下载 最终效果图: SWFUpload的特点: 1.用flash进行上传,页面无刷新,且可自定义Flash按钮的样式; 2.可以在浏

利用windows系统ftp命令编写的BAT文件上传[转]

利用windows系统ftp命令编写的BAT文件上传[转] 利用windows系统ftp命令编写的BAT文件上传[转] 在开发中往往需要将本地的程序上传到服务器,而且用惯了linux命令的人来说.在windows下就比较麻烦了.为了方便特编写一个BAT程序来帮助需要这样功能的人.如果用其他IDE工具自带的FTP功能也可以,^_^!      命令: todev.bat /index.asp  默认d:\cnweb为网站的根目录.      我的 http://www.lawcar.cn/ htt

利用spring的MultipartFile实现文件上传【原】

利用spring的MultipartFile实现文件上传 主要依赖jar包 spring-web-3.0.6.RELEASE.jar 用到 (org.springframework.web.multipart.MultipartFile)commons-fileupload-1.3.1.jarcommons-logging-1.0.4.jar 前台 <!DOCTYPE html> <html lang="en"> <head> <meta ch