本帖最后由 z943366739 于 2011-11-24 20:34:06 编辑

解决方案 »

  1.   

    代码附上:
    监听进度的监听器: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">&nbsp;</td>
          </tr>
      <tr>
        <td width="119">&nbsp;</td>
        <td width="570"><input name="" type="button" value="上传" onClick="document.form.submit();openGetProgress()"></td>
        <td>&nbsp;</td>
          </tr>
      <tr>
        <td id="show" style="border-width:2px" width="119"><img id="progress" src="../images/progress.gif" width="1" height="18" alt="进度">&nbsp;</td>
        <td id="show2" width="970">&nbsp;</td>
        <td>&nbsp;</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>
      

  2.   

    上传进度能获取到,就是看进度信息传达到UI显示处是否同步resultState*110/100这里可以alert吗
      

  3.   

    用alert试过,情况差不多,而且到最后的时候上百个alert等着,最后只好把myeclipse重启了……
      

  4.   

    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
      

  5.   

    哥们,你太帅了!!
    改成window.setInterval("getProgress()",200);
    然后真的成功了!!
    虽然控制台里只输出了一次getProgress:,但却是看到了进度条!!(这点确实不解)爱死你了!!