ajax实现带进度条的文件上传

jsp部分:设计一个表单,form的属性添加 enctype="multipart/form-data",设计一个iframe,设为隐藏。form的target等于iframe的name;

servlet部分:文件上传用的Commons-FileupLoad,需要两个Jar,commons-fileupload和commons-io,少了第二个会报出找不到类的异常;

第一个servlet处理上传,及把上传进度保存到session,第二个servlet处理ajax请求,回传session保存的进度值;

进度条:可以用ajax拿到回传的进度值,改变图片的width实现变化;

jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/progress.css">
<script type="text/javascript" src="js/ul.js" charset="gbk"></script>
</head>
<body>
<form action="UploadServlet" name="f1" id="f1" method="post" enctype="multipart/form-data" target="if">
	<input type="file" name="file1" /><br><br>
	<input type="reset" name="res1" value="重置"/>
	<input type="button" name="but1" value="提交" onclick="go();"/>
</form><br>
<div id="pro" class="pro" align="left">
	<img alt="" src="photo/progress.png" width="0" height="15" id="imgpro">
</div>
        <span id="prop" style="width:15px;height:15px;display: none;">0%</span>
<iframe id="if" name="if" src="" style="display: none"></iframe>
</body>
</html>

这是index.jsp里的代码:

提交后还在当前页显示进度,所以要用到iframe,提交后的返回放到隐藏的iframe里,不影响页面效果;

css代码:

.pro{
	height:15px;
	width:500px;
	background: #FFFFF0;
	border: 1px solid #8FBC8F;
	margin: 0;
	padding: 0;
	display:none;
	position: relative;
	left:25px;
	float:left;
}

js代码

function go(){
	f1.submit();
	document.getElementById("pro").style.display="block";
	document.getElementById("prop").style.display="";
	timer=setInterval("getP()",50);

}

var xmlHttpRequest;
function getP(){

	if(window.XmlHttpRequest){
		xmlHttpRequest=new XmlHttpRequest();
	}else{
		xmlHttpRequest=new ActiveXObject("Microsoft.XMLHTTP");
	}	

	xmlHttpRequest.onreadystatechange=callBack;
	url="getProgressServlet";
	xmlHttpRequest.open("post",url,true);

	xmlHttpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");
	xmlHttpRequest.send("&timeStamp="+(new Date()).getTime());	

}
//回调函数
function callBack(){

	if(xmlHttpRequest.readyState==4 && xmlHttpRequest.status==200){	

		result=xmlHttpRequest.responseText;
		var result=result.replace(/(^\s*)|(\s*$)/g, "");
		var res=result.split(",");
		var flag=res[1];
		var per=parseInt(res[0]);
		var err=res[2];
		document.getElementById("imgpro").style.width=per*5+"px";
		document.getElementById("prop").innerHTML=per+"%";
		if(flag=="OK"){
			window.clearInterval(timer);
			alert("上传成功!");
			document.getElementById("pro").style.display="none";
			document.getElementById("prop").innerHTML="";
			f1.reset();
		}
		if(err!=""||err.length>0){
			window.clearInterval(timer);
			alert(err);
		}
		if(flag==null){
			window.clearInterval(timer);
		}
	}
}

flag为上传成功标记,err为出错标记;

servlet代码(UploadServlet):

package com.ul.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

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

public class UploadServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置编码格式为utf-8
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		//获取session,保存进度和上传结果,上传结果初始值为NOK,当为Ok表示上传完成
		HttpSession session=request.getSession();
		session.setAttribute("prog", "0");
		session.setAttribute("result", "NOK");
		session.setAttribute("error", "");
		String error="";
		//给上传的文件设一个最大值,这里是不得超过50MB
		int maxSize=50*1024*1024;
		//创建工厂对象和文件上传对象
		DiskFileItemFactory factory=new DiskFileItemFactory();
		ServletFileUpload upload=new ServletFileUpload(factory);
		try {
			//解析上传请求
			List items=upload.parseRequest(request);
			Iterator itr=items.iterator();

			while(itr.hasNext()){
				FileItem item=(FileItem)itr.next();
				//判断是否为文件域
				if(!item.isFormField()){
					if(item.getName()!=null&&!item.getName().equals("")){
						//获取上传文件大小和文件名称
						long upFileSize=item.getSize();
						String fileName=item.getName();
						if(upFileSize>maxSize){
							error="您上传的文件太大了,请选择不超过50MB的文件!";
							break;
						}
						//此时文件暂存在服务器的内存中,构造临时对象
						File tempFile=new File(fileName);
						//指定文件上传服务器的目录及文件名称
						File file=new File("f:\\temp",tempFile.getName());
						//构造输入流读文件
						InputStream is=item.getInputStream();
						int length=0;
						byte[] by=new byte[1024];
						double persent=0;
						FileOutputStream fos=new FileOutputStream(file);
						PrintWriter out=response.getWriter();
						while((length=is.read(by))!=-1){
							//计算文件进度
							persent+=length/(double)upFileSize*100D;
							fos.write(by, 0, length);
							session.setAttribute("prog", Math.round(persent)+"");
							Thread.sleep(10);
						}
						fos.close();
						Thread.sleep(1000);
					}else{
						error="没选择上传文件!";
					}
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
			error="上传文件出现错误:"+e.getMessage();
		}
		if(!error.equals("")){
			session.setAttribute("error", error);
		}else{
			session.setAttribute("result", "OK");
		}
	}
}

不要忘记commons-io包

servlet代码(getProgressServlet):

package com.ul.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class getProgressServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		HttpSession sesson=request.getSession();
		PrintWriter out=response.getWriter();
		String str=(String)sesson.getAttribute("prog")+"";
		String res=(String)sesson.getAttribute("result");
		String err=(String)sesson.getAttribute("error");
		System.out.println(str+","+res+","+err);
		out.print(str+","+res+","+err);

		out.flush();
		out.close();
	}

}



时间: 2024-10-05 15:33:29

ajax实现带进度条的文件上传的相关文章

Ajax技术——带进度条的文件上传

1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能.在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度, 可以在上传文件的同时,显示文件的上传进度条.运行本实例,如图1所示,访问文件上传页面,单击“浏览”按钮选择要上传的文件,注意文件不能超过 50MB,否则系统将给出错误提示.选择完要上传的文件后,单击“提交”按钮,将会上传文件并显示上传进度. 2.技术要点 主要是应用开源的Common-FileUpload组件来实现分段文件上传,从而实现在上传

带进度条的文件上传

Ajax技术——带进度条的文件上传 1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能.在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度,可以在上传文件的同时,显示文件的上传进度条.运行本实例,如图1所示,访问文件上传页面,单击“浏览”按钮选择要上传的文件,注意文件不能超过50MB,否则系统将给出错误提示.选择完要上传的文件后,单击“提交”按钮,将会上传文件并显示上传进度. 2.技术要点 主要是应用开源的Common-FileUpload组件来

带进度的多文件上传(支持上传.doc后缀的word文档并在线预览)

原文:带进度的多文件上传(支持上传.doc后缀的word文档并在线预览) 源代码下载地址:http://www.zuidaima.com/share/1550463556848640.htm 演示地址:http://img.zeroteam.net/     访问路径和自己工程的设置有关 如:http://localhost:8081/strutd2_fileupload/index.jsp

Dropzone带进度显示多文件上传插件

插件效果 默认状态 选中文件 上传进度 插件下载,网盘链接 插件调用示例 <link rel="stylesheet" type="text/css" href="dropzone/dropzone.css"> <script type="text/javascript" src="dropzone/dropzone.js"></script> <style typ

JQuery和Servlet实现文件上传进度条,能显示上传速度,上传的百分比等

原文:JQuery和Servlet实现文件上传进度条,能显示上传速度,上传的百分比等 源代码下载地址:http://www.zuidaima.com/share/1550463319542784.htm JQuery和Servlet实现文件上传进度条,能显示上传速度,上传的百分比等

PHP+Ajax异步带进度条上传文件

前端引入文件 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> <script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script> <script src="

带进度条的文件批量上传插件uploadify

有时项目中需要一个文件批量上传功能时,个人认为uploadify是快速简便的解决方案. 先上效果图: 一. 下载uploadify 从官网下载uploadify的Flash版本(Flash版本免费,另一版本HTML5版本需要付费) 下载地址: http://www.uploadify.com/download/ 下载后直接把文件解压,然后放在项目中 二. 在项目中使用 在页面中引入: <!--引入Jquery--> <script src="js/jquery-1.11.3.m

WebApi实现Ajax模拟Multipart/form-data方式多文件上传

前端页面代码: <input type="file" class="file_control" /><br /> <input type="file" class="file_control" /><br /> <input type="file" class="file_control" /> <button id=&q

第65篇 AJAX初识 校验用户名 登录示例 文件上传 csrftoken

1, 知识储备 2. AJAX的定义 异步的JavaScript和XML 使用场景: JavaScript和后端的数据传递 2.1原生的JavaScript实现AJAX 2.2 JQuery实现 2.3验证用户名是否存在 或者 3.csrftoken问题的解决 4文件上传 原文地址:https://www.cnblogs.com/cavalier-chen/p/9949390.html