如题~要后台生成一个文件,文件比较大 所以需要显示进度条 
该怎么实现 求代码~麻烦注释详细点

解决方案 »

  1.   


    好吧 也许我没说清楚 ~jsp中使用的
      

  2.   

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    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 UpLoad extends HttpServlet { private static final long serialVersionUID = 1L;
    long upFileSize; protected void processRequest(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=GBK");
    String action = request.getParameter("action");
    if ("uploadFile".equals(action)) {
    this.uploadFile(request, response); // 上传文件
    }
    } @SuppressWarnings("unchecked")
    public void uploadFile(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=GBK");
    request.setCharacterEncoding("GBK"); HttpSession session = request.getSession();
    session.setAttribute("progressBar", 0); // 定义指定上传进度的Session变量
    String error = "";
    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(); // 获取FileItem对象
    if (!item.isFormField()) {// 判断是否为文件域
    if (item.getName() != null && !item.getName().equals("")) {// 判断是否选择了文件
    upFileSize = item.getSize(); // 上传文件的大小
    String fileName = item.getName(); // 获取文件名
    // System.out.println("上传文件的大小:" + item.getSize());
    if (upFileSize > maxSize) {
    error = "您上传的文件太大,请选择不超过50M的文件";
    break;
    }
    // 此时文件暂存在服务器的内存中
    File tempFile = new File(fileName);// 构造临时对象
    String uploadPath = this.getServletContext()
    .getRealPath("/upload");
    File file = new File(uploadPath, tempFile.getName()); // 获取根目录对应的真实物理路径
    InputStream is = item.getInputStream();
    int buffer = 1024; // 定义缓冲区的大小
    int length = 0;
    byte[] b = new byte[buffer];
    double percent = 0;
    FileOutputStream fos = new FileOutputStream(file);
    while ((length = is.read(b)) != -1) {
    percent += length / (double) upFileSize * 100D; // 计算上传文件的百分比
    fos.write(b, 0, length); // 向文件输出流写读取的数据
    session.setAttribute("progressBar", Math
    .round(percent)); // 将上传百分比保存到Session中
    }
    fos.close();
    Thread.sleep(1000); // 线程休眠1秒
    } else {
    error = "没有选择上传文件!";
    }
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    error = "上传文件出现错误:" + e.getMessage();
    }
    if (!"".equals(error)) {
    request.setAttribute("error", error);
    request.getRequestDispatcher("error.jsp")
    .forward(request, response);
    } else {
    request.setAttribute("result", "文件上传成功!");
    request.setAttribute("upFileSize", upFileSize);
    request.getRequestDispatcher("upFile_deal.jsp").forward(request,
    response);
    }
    } @Override
    protected void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
    } @Override
    protected void doPost(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    processRequest(request, response);
    } @Override
    public String getServletInfo() {
    return "Short description";
    }
    }
      

  3.   


    怎么那么死脑筋
     int buffer = 1024; // 定义缓冲区的大小
                            int length = 0;
                            byte[] b = new byte[buffer];
                            double percent = 0;
                            FileOutputStream fos = new FileOutputStream(file);
                            while ((length = is.read(b)) != -1) {
                                percent += length / (double) upFileSize * 100D; // 计算上传文件的百分比
                                fos.write(b, 0, length); // 向文件输出流写读取的数据
                                session.setAttribute("progressBar", Math
                                        .round(percent)); // 将上传百分比保存到Session中
                            }
                            fos.close();
                            Thread.sleep(1000); // 线程休眠1秒窃取这一段就行了
      

  4.   

    呵呵
    楼上给他写了后台代码,jsp上他不知道怎么展示出来。
    function SetProgress(progress) { 
    $('#loading').css("width",progress+ "%"); //控制#loading div宽度 
    $('#loading').html(progress+ "%"); //显示百分比

     
    function doProgress()
    {
    if (i > 100) {  $('#loading').hide();
    return; 

    if (i <= 100) { 
    setTimeout("doProgress()", 100); 
    SetProgress(i); 
    i++; 

      

  5.   

    对你我表示很无语。。
    下面是一个完整jsp实现,你建个工程找个jsp粘进去开浏览器就看见了,记得引入jquery的js
    函数里的数据你自己想办法后台送回来拿到就行了,页面怎么跟你的项目结合就自己看着弄吧。
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        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=ISO-8859-1">
    <script src="/jquery-1.6.min.js" type="text/javascript"></script>
    <script type="text/javascript">
    var i = 0;
    function SetProgress(progress) { 
     $('#loading').css("width",progress*10+ "%"); //控制#loading div宽度 
     $('#loading').html(progress*10+ "%"); //显示百分比

      
    function doProgress()
     {
     if (i <= 10) { 
     setTimeout("doProgress()", 1000); 
     SetProgress(i); 
     i++; 
     } 
     }  
    </script>
    </head>
    <body onload="doProgress();">
    <div style="height:50px; background-color:red;" id="loading" >
    </div>
    </body>
    </html>
      

  6.   

    div下面加一行:<h1 align="center" id="h1"></h1>
    js里面显示百分比那一行换成这个:$('#h1').html(progress*10+ "%");
    让你的数值跟着进度条一起动,其他自己参考着弄吧。