跪求高手给解!纠结3天了!jsp显示文件上传进度条问题 本帖最后由 z943366739 于 2011-11-24 20:34:06 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码附上:监听进度的监听器:package modules.fileLoad;import javax.servlet.http.HttpSession;import org.apache.commons.fileupload.ProgressListener;public class UploadListener implements ProgressListener { private HttpSession session=null; public void update(long readBytes, long totalSize, int readItem) { UploadStatus uploadStatus=new UploadStatus(); uploadStatus.setReadBytes(readBytes); uploadStatus.setTotalSize(totalSize); uploadStatus.setReadItem(readItem); long a=uploadStatus.getReadBytes(); long b=uploadStatus.getTotalSize(); int percent= (int)(((double)a/(double)b)*100.0); uploadStatus.setPercent(percent); System.out.println("listener:"+uploadStatus.getPercent()); if(totalSize==-1){ uploadStatus.setStatus("完成对"+readItem+"个文件的读取!读取了"+readBytes+"个字节,总共"+totalSize+"个字节."); }else{ uploadStatus.setStatus("正在上传第"+readItem+"个文件..."); } //FileUploadController.storeUploadStatus(this.session,uploadStatus); session.setAttribute("uploadStatus",uploadStatus); } public UploadListener(HttpSession session){ this.session=session; }}获取进度的controller:package modules.fileLoad;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;public class GetProgressController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { UploadStatus uploadStatus=(UploadStatus) request.getSession().getAttribute("uploadStatus"); PrintWriter out=response.getWriter(); int percent=-1; if(uploadStatus!=null){ percent=uploadStatus.getPercent(); if(percent!=100) System.out.println("getProgress:"+percent); out.print(percent); }else out.print(0); return null; }}文件上传的controller:package modules.fileLoad;import java.io.File;import java.util.Date;import java.util.Iterator;import java.util.List;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.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;public class FileUploadController implements Controller{ private int sizeThreshold=1024; private long maxSize=500*1024*1024; private String tempDir="/temp"; private String fileDir="/uploadFiles"; private long fileSizeMax=500*1024*1024; private long sizeMax=500*1024*1024; private String successView; class UploadThread extends Thread{ HttpServletRequest request; HttpServletResponse response; public UploadThread(HttpServletRequest request,HttpServletResponse response){ this.request=request; this.response=response; } public void run(){ } } public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { try{ String message=""; String root=request.getRealPath(fileDir); String filePath=""; File temp=new File(root+tempDir); if(!temp.exists()) temp.mkdirs(); DiskFileItemFactory factory=new DiskFileItemFactory(); factory.setSizeThreshold(sizeThreshold); factory.setRepository(temp); ServletFileUpload up=new ServletFileUpload(factory); up.setFileSizeMax(fileSizeMax); up.setSizeMax(sizeMax); up.setProgressListener(new UploadListener(request.getSession())); List formList=null; System.out.println("正在读取文件..."+new Date()); try{ formList=up.parseRequest(request); }catch(FileUploadException e){ message="读取文件失败!"; System.out.println(message); } System.out.println("正在上传文件..."+new Date()); if(formList!=null){ Iterator lists=formList.iterator(); while(lists.hasNext()){ FileItem file=(FileItem)lists.next(); if(!file.isFormField()){ String fileName=file.getName(); fileName=getFileName(fileName); if(file.getSize()>maxSize){ message="文件超过指定大小!"; break; } System.out.println("获取文件大小..."+new Date()); Long fileSize=file.getSize(); System.out.println("文件大小:"+fileSize+"时间为:"+new Date()); if(((fileName==null)||(fileName==""))&&(fileSize==0)) continue; String saveName=getSaveName(fileName); filePath=root+"\\"+saveName; //文件保存路径 File saveFile=new File(filePath); try{ file.write(saveFile); Thread.sleep(500); }catch(Exception e){ message+="文件"+fileName+"保存失败"; System.out.println(message); } } } } System.out.println("上传成功!!"+new Date()); return new ModelAndView(successView); }catch(Exception e){ System.out.println(e.toString()); return null; } } //设置fileName,saveName和文件类型 private String getSaveName(String fileName){ Date date=new Date(); return "edu-"+date.getTime()+getExtName(fileName); } private String getFileName(String fileName){ int index1=fileName.lastIndexOf("/"); int index2=fileName.lastIndexOf("\\"); int index=Math.max(index1,index2); if(index!=-1) return fileName.substring(index+1,fileName.length()); else return fileName; } private String getExtName(String fileName){ int index=fileName.lastIndexOf("."); return fileName.substring(index,fileName.length()); } public static void storeUploadStatus(HttpSession session,UploadStatus uploadStatus){ session.setAttribute("uploadStatus",uploadStatus); } public void setSuccessView(String successView){ this.successView=successView; } }文件上传jsp页面:<%@ page contentType="text/html;charset=gbk"%><html> <head> <title>上传文件!</title> <link type="text/css" rel="stylesheet" href="../upFile/css/style.css"> </head> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="0"> <body><form name="form" action="../fileUpload.do" enctype="multipart/form-data" method="post"> <table width="813" height="99" border="0"> <tr> <th colspan="3">上传文件</th> </tr> <tr> <td colspan="2"><input name="file1" type="file" ></td> <td width="10"> </td> </tr> <tr> <td width="119"> </td> <td width="570"><input name="" type="button" value="上传" onClick="document.form.submit();openGetProgress()"></td> <td> </td> </tr> <tr> <td id="show" style="border-width:2px" width="119"><img id="progress" src="../images/progress.gif" width="1" height="18" alt="进度"> </td> <td id="show2" width="970"> </td> <td> </td> </tr></table></form></body><script type="text/javascript">var xmlHttp;var resultState=null;var str="";function getProgress(){ xmlHttp=createXmlHttp(); xmlHttp.onreadystatechange=result; xmlHttp.open("GET","../getUploadProgress.do?date="+new Date()); xmlHttp.send(null); if(result!=100) window.setTimeout(getProgress(),400);}function result(){ if(xmlHttp.readyState==4){ //响应完成 if(xmlHttp.status==200){ //返回成功 resultState=xmlHttp.responseText; document.getElementById("progress").width=resultState*110/100; str=resultState+"-----"+str; document.getElementById("show2").innerHTML=str; } }}function createXmlHttp(){ if(window.ActiveXObject) var xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); else var xmlHttp=new XMLHttpRequest(); return xmlHttp;}function openGetProgress(){ getProgress();}</script></html> 上传进度能获取到,就是看进度信息传达到UI显示处是否同步resultState*110/100这里可以alert吗 用alert试过,情况差不多,而且到最后的时候上百个alert等着,最后只好把myeclipse重启了…… function getProgress(){ xmlHttp=createXmlHttp(); xmlHttp.onreadystatechange=result; xmlHttp.open("GET","../getUploadProgress.do?date="+new Date()); xmlHttp.send(null); if(result!=100) window.setTimeout(getProgress(),400);}应该不要嵌套方式调用timeout,在其它方法执行setTimeout 哥们,你太帅了!!改成window.setInterval("getProgress()",200);然后真的成功了!!虽然控制台里只输出了一次getProgress:,但却是看到了进度条!!(这点确实不解)爱死你了!! 怎么解决struts2在谷歌浏览器下载文件不成功的问题。(收到来自服务器的重复标头) Hql语句问题,有截图 特急,struts2的一个问题 在sqlServer2005中删除图片问题 sql语句 关于响应 action和样式表的问题 如何在Struts的Action中调用servlet中的方法? jboss下怎么部署petstore? 为什么我的j2eesdk没有CloudScape 请教 JBuilderX 和 Weblogic 问题 Tomcat 求助,有关ServletActionContext.getServletContext().getAttribute
监听进度的监听器:package modules.fileLoad;import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.ProgressListener;public class UploadListener implements ProgressListener {
private HttpSession session=null;
public void update(long readBytes, long totalSize, int readItem) {
UploadStatus uploadStatus=new UploadStatus();
uploadStatus.setReadBytes(readBytes);
uploadStatus.setTotalSize(totalSize);
uploadStatus.setReadItem(readItem);
long a=uploadStatus.getReadBytes();
long b=uploadStatus.getTotalSize();
int percent= (int)(((double)a/(double)b)*100.0);
uploadStatus.setPercent(percent);
System.out.println("listener:"+uploadStatus.getPercent());
if(totalSize==-1){
uploadStatus.setStatus("完成对"+readItem+"个文件的读取!读取了"+readBytes+"个字节,总共"+totalSize+"个字节.");
}else{
uploadStatus.setStatus("正在上传第"+readItem+"个文件...");
}
//FileUploadController.storeUploadStatus(this.session,uploadStatus);
session.setAttribute("uploadStatus",uploadStatus);
}
public UploadListener(HttpSession session){
this.session=session;
}
}获取进度的controller:
package modules.fileLoad;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;public class GetProgressController implements Controller { public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
UploadStatus uploadStatus=(UploadStatus) request.getSession().getAttribute("uploadStatus"); PrintWriter out=response.getWriter();
int percent=-1;
if(uploadStatus!=null){
percent=uploadStatus.getPercent();
if(percent!=100)
System.out.println("getProgress:"+percent);
out.print(percent);
}else
out.print(0);
return null;
}}文件上传的controller:
package modules.fileLoad;import java.io.File;
import java.util.Date;
import java.util.Iterator;
import java.util.List;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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;public class FileUploadController implements Controller{
private int sizeThreshold=1024;
private long maxSize=500*1024*1024;
private String tempDir="/temp";
private String fileDir="/uploadFiles";
private long fileSizeMax=500*1024*1024;
private long sizeMax=500*1024*1024;
private String successView;
class UploadThread extends Thread{
HttpServletRequest request;
HttpServletResponse response;
public UploadThread(HttpServletRequest request,HttpServletResponse response){
this.request=request;
this.response=response;
}
public void run(){
}
}
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
try{
String message="";
String root=request.getRealPath(fileDir);
String filePath="";
File temp=new File(root+tempDir);
if(!temp.exists())
temp.mkdirs();
DiskFileItemFactory factory=new DiskFileItemFactory();
factory.setSizeThreshold(sizeThreshold);
factory.setRepository(temp);
ServletFileUpload up=new ServletFileUpload(factory);
up.setFileSizeMax(fileSizeMax);
up.setSizeMax(sizeMax);
up.setProgressListener(new UploadListener(request.getSession()));
List formList=null;
System.out.println("正在读取文件..."+new Date());
try{
formList=up.parseRequest(request);
}catch(FileUploadException e){
message="读取文件失败!";
System.out.println(message);
}
System.out.println("正在上传文件..."+new Date());
if(formList!=null){
Iterator lists=formList.iterator();
while(lists.hasNext()){
FileItem file=(FileItem)lists.next();
if(!file.isFormField()){
String fileName=file.getName();
fileName=getFileName(fileName);
if(file.getSize()>maxSize){
message="文件超过指定大小!";
break;
} System.out.println("获取文件大小..."+new Date());
Long fileSize=file.getSize();
System.out.println("文件大小:"+fileSize+"时间为:"+new Date());
if(((fileName==null)||(fileName==""))&&(fileSize==0))
continue;
String saveName=getSaveName(fileName);
filePath=root+"\\"+saveName; //文件保存路径
File saveFile=new File(filePath);
try{
file.write(saveFile);
Thread.sleep(500);
}catch(Exception e){
message+="文件"+fileName+"保存失败";
System.out.println(message);
}
}
}
}
System.out.println("上传成功!!"+new Date()); return new ModelAndView(successView);
}catch(Exception e){
System.out.println(e.toString());
return null;
}
}
//设置fileName,saveName和文件类型
private String getSaveName(String fileName){
Date date=new Date();
return "edu-"+date.getTime()+getExtName(fileName);
}
private String getFileName(String fileName){
int index1=fileName.lastIndexOf("/");
int index2=fileName.lastIndexOf("\\");
int index=Math.max(index1,index2);
if(index!=-1)
return fileName.substring(index+1,fileName.length());
else
return fileName;
}
private String getExtName(String fileName){
int index=fileName.lastIndexOf(".");
return fileName.substring(index,fileName.length());
}
public static void storeUploadStatus(HttpSession session,UploadStatus uploadStatus){
session.setAttribute("uploadStatus",uploadStatus);
}
public void setSuccessView(String successView){
this.successView=successView;
}
}文件上传jsp页面:
<%@ page contentType="text/html;charset=gbk"%>
<html>
<head>
<title>上传文件!</title>
<link type="text/css" rel="stylesheet" href="../upFile/css/style.css">
</head>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
<body>
<form name="form" action="../fileUpload.do" enctype="multipart/form-data" method="post">
<table width="813" height="99" border="0">
<tr>
<th colspan="3">上传文件</th>
</tr>
<tr>
<td colspan="2"><input name="file1" type="file" ></td>
<td width="10"> </td>
</tr>
<tr>
<td width="119"> </td>
<td width="570"><input name="" type="button" value="上传" onClick="document.form.submit();openGetProgress()"></td>
<td> </td>
</tr>
<tr>
<td id="show" style="border-width:2px" width="119"><img id="progress" src="../images/progress.gif" width="1" height="18" alt="进度"> </td>
<td id="show2" width="970"> </td>
<td> </td>
</tr>
</table>
</form>
</body>
<script type="text/javascript">
var xmlHttp;
var resultState=null;
var str="";
function getProgress(){
xmlHttp=createXmlHttp();
xmlHttp.onreadystatechange=result;
xmlHttp.open("GET","../getUploadProgress.do?date="+new Date());
xmlHttp.send(null);
if(result!=100)
window.setTimeout(getProgress(),400);
}
function result(){
if(xmlHttp.readyState==4){ //响应完成
if(xmlHttp.status==200){ //返回成功
resultState=xmlHttp.responseText;
document.getElementById("progress").width=resultState*110/100;
str=resultState+"-----"+str;
document.getElementById("show2").innerHTML=str;
}
}
}
function createXmlHttp(){
if(window.ActiveXObject)
var xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
else
var xmlHttp=new XMLHttpRequest();
return xmlHttp;
}
function openGetProgress(){
getProgress();
}</script>
</html>
xmlHttp=createXmlHttp();
xmlHttp.onreadystatechange=result;
xmlHttp.open("GET","../getUploadProgress.do?date="+new Date());
xmlHttp.send(null);
if(result!=100)
window.setTimeout(getProgress(),400);
}应该不要嵌套方式调用timeout,在其它方法执行setTimeout
改成window.setInterval("getProgress()",200);
然后真的成功了!!
虽然控制台里只输出了一次getProgress:,但却是看到了进度条!!(这点确实不解)爱死你了!!