Servlet实现上传文件进度条

首先用EasyUI做界面:
<div id="loading2">

		<div class="inputdiv" >
			<img class="prtspan span_1" src="images/loading.gif"/>
			<h3 class="prtspan span_1" >war包正在部署,请稍候......</h3>
		</div>
	</div> 
<div id="loading1" style="display:none;">
                        <div id="loading" class="easyui-progressbar" style="width:700px;"></div>
</div> 


前端主要的js代码:

//定时器:文件上传是否完成了
var _finished = false;
function update_file_percent(){
if(_finished) return;
 $.get("deploy/ProgressUploadServlet",{} 
          ,function(data,textStatus){
           if(data=="100" || data==100){
              $('#loading').progressbar('setValue',0); 
              $('#loading1').css("display","none");
            $('#loading2').window('open'); 
              return;
           }
           $('#loading').progressbar('setValue', parseInt(data));//返回的data包含有换行符,必须要转成数字,否则进度条出不来颜色 
            setTimeout("update_file_percent()", 1000); 
          });
}


//部署应用程序
function list_to_deploy_app(){
$("#btnAddWar").click(function(){
            _finished = false;
             $("btnAddWar").attr("disabled","true"); 
               $('#loading').progressbar('setValue', 0); 
               $('#loading1').css("display","block");
               //这里的post是为了是服务器重新初始化session,否则会导致连续上传文件出bug
                $.post("deploy/ProgressUploadServlet",{type:"first"},function(data,textStatus){
                    setTimeout("update_file_percent()", 1000); 
                    $('#addWar').form('submit', 
                        {    
                            url:"deploy/ProgressUploadServlet",    
                            onSubmit: function(){    
                                $("#hip").val(ip);   
                                $("#hport").val(port); 
                            },
                            success:function(data){ 
                                 _finished = true;
                                 $('#loading2').window('close'); 
                                 $('#loading1').css("display","none");
                                 $('#loading').progressbar('setValue',0); 
                                var m_obj = JSON.parse(data); 
                                $("btnAddWar").attr("disabled","false"); 
                                if(m_obj && m_obj.success == true){
                                    messagebox_tip('war包' + $("#incontext").val() + '部署成功!');
                                }else{
                                    messagebox_tip('war包' + $("#incontext").val() + '部署失败!\n失败原因是:'+m_obj.message); 
                                }
                            }
                        }
                    );//form submit   
                    
           });
}
);
}


修改web.xml文件,添加如下Servlet

<servlet>
<servlet-name>ProgressUploadServlet</servlet-name>
<servlet-class>
com.southgis.scout.hub.action.deploy.ProgressUploadServlet
</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ProgressUploadServlet</servlet-name>
<url-pattern>/deploy/ProgressUploadServlet</url-pattern>
</servlet-mapping>

UploadListener.java

package com.southgis.scout.hub.action.deploy;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.ProgressListener;

public class UploadListener implements ProgressListener {

	
	private HttpSession session1;  
	public UploadListener(HttpServletRequest request) {
	
		session1=request.getSession(false);  
	}

	public void update(long bytesRead, long contentLength, int items) {
		int percent = (int) (100 * (double) bytesRead / (double) contentLength);
		session1.setAttribute("read",String.valueOf(percent)); 
	}
}

ProgressUploadServlet .java

package com.southgis.scout.hub.action.deploy;

import static com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteMapNullValue;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteNullListAsEmpty;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteNullNumberAsZero;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteNullStringAsEmpty;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.southgis.scout.core.util.Constant;
import com.southgis.scout.core.util.DateUtil;
import com.southgis.scout.core.util.HttpUtil;


public class ProgressUploadServlet extends HttpServlet {

	private static final long serialVersionUID = -4935921396709035718L;
	protected static final SerializerFeature[] features = { WriteMapNullValue, WriteNullListAsEmpty,
		WriteNullNumberAsZero, WriteNullStringAsEmpty, DisableCircularReferenceDetect };
	
	protected void outputString(String str,HttpServletResponse response) throws IOException {
		response.setContentType(Constant.CONTENT_TYPE_HTML);
		response.setCharacterEncoding(Constant.UTF8);
		response.getWriter().print(str);
		response.getWriter().flush();
		response.getWriter().close();
	}
	protected void outJsonResult(Object obj,HttpServletResponse response) throws IOException {
		String result = JSON.toJSONStringWithDateFormat(obj, DateUtil.SHORT_TIME_FORMAT, features);
		outputString(result,response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String type=request.getParameter("type");
		if(type!=null){
			//第一次初始化session,如果不这样做,会导致连续上传文件出bug
			HttpSession session = request.getSession(false);
			if(session!=null)
			{
				session.invalidate();
			}
			session = request.getSession(true);
			return;
		}
			
		String filePath="";
		// 监听器
		UploadListener listener = new UploadListener(request);
		// Apache 上传工具
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		// 设置 listener
		upload.setProgressListener(listener);
		Map<String, String> map = new HashMap<String, String>();
		try {
			List itemList = upload.parseRequest(request);
			for (Iterator it = itemList.iterator(); it.hasNext();) {
				FileItem item = (FileItem) it.next();
				if (!item.isFormField()) {
					// 获取文件输出目录
					 String nowpath;             //当前tomcat的bin目录的路径 如 D:\java\software\apache-tomcat-6.0.14\bin
					 String tempdir;
					 nowpath=System.getProperty("user.dir");
					 tempdir=nowpath.replace("bin", "wars");  //把bin 文件夹变到 webapps文件里面 
					 //如果不存在tempdir则新建目录
						File myPath = new File(tempdir);
						if (!myPath.exists()) {
							myPath.mkdir();
						}
					//tempdir="F:/wars";测试用
					SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
					// 统一 Linux 与 windows 的路径分隔符
					String fileName =formatter.format(new Date()) + item.getName().replace("/", "\\");
					filePath=tempdir+"/"+fileName;
					File saved = new File(filePath);
					saved.getParentFile().mkdirs();
					item.write(saved);
				}
				else{
					map.put(item.getFieldName(),item.getString());
				}
			}
		} catch (Exception e) {
			outJsonResult(new JSONObject(),response);
		}
		
		String url = "http://" + map.get("ip") + ":" + map.get("port") + "/plug/deploy/deploywar";
		String a="true";
		if(map.get("update")==null){
			a="false";
		}
		map.put("update", a);
		String result = HttpUtil.postFile(url, "attach", filePath, map);
		JSONObject jsonObj = JSONObject.parseObject(result);
		outJsonResult(jsonObj,response);
		
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setHeader("Cache-Control", "no-store");
		response.setHeader("Pragrma", "no-cache");
		response.setDateHeader("Expires", 0);response.setContentType("text/html;charset=UTF-8");
//如果不这样就会出现firefox 的jQuery.get返回object xmldocument的问题,或者你在jQuery.get中设置dataType为text
		
		HttpSession session = request.getSession(false);
		 String value=(String )session.getAttribute("read");
			if (value != null) {
			  
			    response.getWriter().println(value);
			}
			else{
				response.getWriter().println("0");
			}
		}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值