我最近做了一个上传文件的页面,使用的是jsp和serlvet技术,最近要添加一个上传文件的时候要个进度表,请问这个进度表怎么做啊?

解决方案 »

  1.   

    楼下一定会说用jquery进度条,但是用过后的确不错
      

  2.   

    用ajax轮询获取上传数据情况信息
      

  3.   

    服务器端用的apache的那个上传lib吗?那个里面有一个事件,可以在每次读byte的时候触发。用session将percent记录下来。然后客户端用ajax每次去读session里的那个percent。至于客户端用什么进度条随便啦。
      

  4.   

    你想自己写,给你一段代码:
    /**
     * 上传文件的监听器
     * @author xjl
     * @version 2.0
     */
    public class UploadListener implements ProgressListener {

    private UploadInfo info;

    /**
     * 构造方法
     * @param session
     */
    public UploadListener(HttpSession session) {
    info = (UploadInfo) session.getAttribute(FrameConfig.uploadInfo);
    if (null == info) {
    info = new UploadInfo();
    }
    session.setAttribute(FrameConfig.uploadInfo, info);
    } /**
     * 上传文件即时监听
     * @param readSize 已上传字节数
     * @param fileSize 文件总大小
     * @param num 目前正在读取第几个文件
     */
    public void update(long readSize, long fileSize, int num) {
    if (num > 0) {
    Double percent = ( ((Long) readSize).doubleValue() / ((Long) fileSize).doubleValue()) * 100d;
    info.setFileSize(fileSize);
    info.setNum(num);
    info.setPercent(percent.intValue());
    info.setReadSize(readSize);
    }
    }}/**
     * 上传文件, 返回上传成功的文件个数, 可以读取文件上传的实时进度
     * @param folder 文件存放的目录,物理路径
     * @param newFileName 保存为新文件的名称(支持多个文件同时上传)
     * @return int 
     */
    @SuppressWarnings("unchecked")
    public int uploadFile(String folder, String []newFileName) {
    int num = -1;
    try {
    File folderFile = new File(folder);
    FileUtil.getBean().createFolder(folder);
    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(4096);
    ServletFileUpload upload = new ServletFileUpload(factory);
    upload.setSizeMax(FrameConfig.maxUploadFileSize);
    upload.setProgressListener(new UploadListener(getSession()));
    getRequest().setCharacterEncoding("UTF-8");
    Iterator iterator = upload.parseRequest(getRequest()).iterator();
    while (iterator.hasNext()) {
    FileItem item = (FileItem) iterator.next();//源文件
    if (!item.isFormField() && !"".equals(item.getName())) {
    num++;
    if (num < newFileName.length) {
    OutputStream output = new FileOutputStream(new File(folderFile, newFileName[num]));
    InputStream input = item.getInputStream();
    try {
    byte[] buffer = new byte[1024];
    int i = 0;
    while ((i = input.read(buffer)) != -1) {
    output.write(buffer, 0, i);//保存文件
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    input.close();
    output.close();
    }
    } else {
    break;
    }
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return num + 1;
    }

    /**
     * 文件上传时读取即时的上传进度(返回json格式字符串)
     * @return String
     */
    public String readUploadProgress() {
    String result = "";
    UploadInfo info = (UploadInfo) getSession().getAttribute(FrameConfig.uploadInfo);
    if (null != info) {
    return "{readSize:\"" + info.getReadSize() + 
    "\",fileSize:\"" + info.getFileSize() + 
    "\",num:\"" + info.getNum() + 
    "\",percent:\"" + info.getPercent() + "\"}";
    }
    return result;
    }
      

  5.   


    你这个不就是用的apache的Upload组件吗?实现了ProgressListener,在上传的时候加入组件。并且将进度内容保存进session。只是你这个类习惯很不好。1.  upload.setProgressListener(new UploadListener(getSession()));
    这是啥代码,new两遍?你一定要这么搞还不如
    upload.setProgressListener(this);2.  e.printStackTrace();??这个生产环境能用吗?3.  try和finally的位置也不对4.  public int uploadFile(String folder, String []newFileName)方法第一第二个if的用法也不对如果要真的代码review,这段代码不知道要死多少次啊。
      

  6.   


    你这段代码我知道能用。但,仅仅是能用而已,你如果是个有经验的开发者就知道生产环境是什么意思了。我说了,这段代码做source review能够指摘到死。