博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
文件上传---动作条
阅读量:6073 次
发布时间:2019-06-20

本文共 11991 字,大约阅读时间需要 39 分钟。

  利用Apache commons fileupload上传文件,直接显示其完成的进度条。----示例代码源自《JAVA WEB王者归来》

  1 首先要显示动作条要利用Ajax的异步请求,使得在没有完成时,不会刷新本页,而是局部的刷新。如果没有指定form的定向页面,默认是刷新本页,正常我们提交一个form刷新本页,在没有完成请求前是显示空白的网页,这里我们指定他刷新一个不显示的区域,就要用到form的属性target。

    

  2 我们创建一个status的bean,用来保存一些状态信息,比如名字,读取的长度,读取的字节大小,时间等等。

public class UploadStatus {    private long bytesRead;    private long contentLength;    private int items;    private long startTime = System.currentTimeMillis();    public long getBytesRead() {        return bytesRead;    }    public void setBytesRead(long bytesRead) {        this.bytesRead = bytesRead;    }    public long getContentLength() {        return contentLength;    }    public void setContentLength(long contentLength) {        this.contentLength = contentLength;    }    public int getItems() {        return items;    }    public void setItems(int items) {        this.items = items;    }    public long getStartTime() {        return startTime;    }    public void setStartTime(long startTime) {        this.startTime = startTime;    }}

  3 创建一个监听器实时的获取状态信息

public class UploadListener implements ProgressListener {    private UploadStatus status;    public UploadListener(UploadStatus status){        this.status = status;    }    public void update(long bytesRead,long contentLength,int items){        status.setBytesRead(bytesRead);        status.setContentLength(contentLength);        status.setItems(items);    }}

  4 form表单用pos方法提交后,在doPost里面获取状态信息,保存到session中。在本页面,在自动用get方法读取session中的信息,返回给网页,网页动态的进行数据的显示。

  doPost

UploadStatus status = new UploadStatus();        UploadListener listener = new UploadListener(status);        request.getSession(true).setAttribute("uploadStatus",status);                ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());                upload.setProgressListener(listener);

  doGet

long startTime = status.getStartTime();        long currentTime = System.currentTimeMillis();        long time = (currentTime - startTime)/1000 + 1;                double velocity = ((double)status.getBytesRead())/(double)time;                double totalTime = status.getContentLength()/velocity;                double timeLeft = totalTime - time;                int percent = (int)(100*(double)status.getBytesRead()/(double)status.getContentLength());                double length = ((double)status.getBytesRead())/1024/1024;                double totalLength = ((double)status.getContentLength())/1024/1024;                String value = percent +"||" + length + "||" +totalLength+"||"+                        velocity+"||"+time+"||"+totalTime+"||"+timeLeft+"||"+status.getItems();                response.getWriter().println(value);

js

全部代码:

progressFileupload.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>              My JSP 'progressFileupload.jsp' starting page        

UploadStatus.java

package com.test.temp;public class UploadStatus {    private long bytesRead;    private long contentLength;    private int items;    private long startTime = System.currentTimeMillis();    public long getBytesRead() {        return bytesRead;    }    public void setBytesRead(long bytesRead) {        this.bytesRead = bytesRead;    }    public long getContentLength() {        return contentLength;    }    public void setContentLength(long contentLength) {        this.contentLength = contentLength;    }    public int getItems() {        return items;    }    public void setItems(int items) {        this.items = items;    }    public long getStartTime() {        return startTime;    }    public void setStartTime(long startTime) {        this.startTime = startTime;    }}

UploadListener.java

package com.test.temp;import org.apache.commons.fileupload.ProgressListener;public class UploadListener implements ProgressListener {    private UploadStatus status;    public UploadListener(UploadStatus status){        this.status = status;    }    public void update(long bytesRead,long contentLength,int items){        status.setBytesRead(bytesRead);        status.setContentLength(contentLength);        status.setItems(items);    }}

PorgressUploadServlet.java

package com.test.hello;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintWriter;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 org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import com.test.temp.UploadListener;import com.test.temp.UploadStatus;public class ProgressUploadServlet extends HttpServlet {    /**     * Constructor of the object.     */    public ProgressUploadServlet() {        super();    }    /**     * Destruction of the servlet. 
*/ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet.
* * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ 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); UploadStatus status = (UploadStatus) request.getSession(true).getAttribute("uploadStatus"); if(status == null){ response.getWriter().println("没有上传信息"); return; } long startTime = status.getStartTime(); long currentTime = System.currentTimeMillis(); long time = (currentTime - startTime)/1000 + 1; double velocity = ((double)status.getBytesRead())/(double)time; double totalTime = status.getContentLength()/velocity; double timeLeft = totalTime - time; int percent = (int)(100*(double)status.getBytesRead()/(double)status.getContentLength()); double length = ((double)status.getBytesRead())/1024/1024; double totalLength = ((double)status.getContentLength())/1024/1024; String value = percent +"||" + length + "||" +totalLength+"||"+ velocity+"||"+time+"||"+totalTime+"||"+timeLeft+"||"+status.getItems(); response.getWriter().println(value); } /** * The doPost method of the servlet.
* * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { UploadStatus status = new UploadStatus(); UploadListener listener = new UploadListener(status); request.getSession(true).setAttribute("uploadStatus",status); ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); upload.setProgressListener(listener); try{ List itemList = upload.parseRequest(request); for(Iterator it = itemList.iterator();it.hasNext();){ FileItem item = (FileItem)it.next(); if(item.isFormField()){ System.out.println("FormField:"+item.getFieldName()+"="+item.getString()); }else{ System.out.println("File:"+item.getName()); String fileName = item.getName().replace("/","\\"); fileName = fileName.substring(fileName.lastIndexOf("\\")); File saved = new File("D:\\upload_temp",fileName); saved.getParentFile().mkdirs(); InputStream ins = item.getInputStream(); OutputStream ous = new FileOutputStream(saved); byte[] tmp = new byte[1024]; int len = -1; while((len = ins.read(tmp)) != -1){ ous.write(tmp,0,len); } ous.close(); ins.close(); response.getWriter().println("已保存文件:"+saved); } } }catch(Exception e){ response.getWriter().println("上传发生错误:"+e.getMessage()); } // response.setContentType("text/html");// PrintWriter out = response.getWriter();// out// .println("");// out.println("");// out.println(" A Servlet");// out.println(" ");// out.print(" This is ");// out.print(this.getClass());// out.println(", using the POST method");// out.println(" ");// out.println("");// out.flush();// out.close(); } /** * Initialization of the servlet.
* * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here }}

web.xml

This is the description of my J2EE component
This is the display name of my J2EE component
PostServlet
com.test.hello.PostServlet
This is the description of my J2EE component
This is the display name of my J2EE component
test
com.test.hello.test
This is the description of my J2EE component
This is the display name of my J2EE component
UploadServlet
com.test.hello.UploadServlet
This is the description of my J2EE component
This is the display name of my J2EE component
ProgressUploadServlet
com.test.hello.ProgressUploadServlet
PostServlet
/servlet/PostServlet
test
/servlet/test
UploadServlet
/servlet/UploadServlet
ProgressUploadServlet
/servlet/ProgressUploadServlet
index.jsp

运行结果:

  

本文转自博客园xingoo的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
Lightning学習資料
查看>>
字节流与字符流的区别详解
查看>>
js数组去重的4个方法
查看>>
Floyd判圈算法
查看>>
hdu 4965 矩阵快速幂 矩阵相乘性质
查看>>
iOS - App 应用
查看>>
用户登录验证
查看>>
TSVNCache.exe严重占用CPU问题
查看>>
详细易懂的解释变量和指针变量重新赋值的过程和问题
查看>>
Python 操作 MYSQL
查看>>
关于解决javaEE端口占用的方法
查看>>
mysql 更改表名称
查看>>
handlerbars入门学习
查看>>
关于“VS2010语法检查红线不见了”的解决方案
查看>>
C++模板使用介绍
查看>>
Object-C中 - self 和super 的含义
查看>>
Optimizing graphics performance
查看>>
C#方法拓展
查看>>
kafka的分区分配策略
查看>>
react-keeper
查看>>