zoukankan      html  css  js  c++  java
  • 带有进度条监听事件的文件上传

    第一种方法:(利用jquery中自带的xhr属性)

    jsp页面代码:

     1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
     2 <html>
     3 <head>
     4     <title>文件上传监听</title>
     5 </head>
     6 <style>
     7     #box{
     8         width: 300px;
     9         height: 20px;
    10         border: 1px solid black;
    11     }
    12     #content{
    13         width: 0%;
    14         height: 20px;
    15         background: green;
    16         margin-top: -10px;
    17     }
    18 </style>
    19 <script src="js/jquery-1.11.3.min.js"></script>
    20 <body>
    21 <form id="frm" action="#" method="post">
    22     <p><input type="file" name="file" ></p>
    23     <p><input id="btn" type="button" value="提交"></p>
    24 </form>
    25 <p id="p"></p>
    26 <div id="box">
    27     <div id="content"></div>
    28 </div>
    29 
    30 </body>
    31 <script>
    32     $(function(){
    33         $("#btn").click(function(){
    34             var formData=new FormData($("#frm")[0]);
    35             $.ajax({
    36                 url:"listenerUpload.do",
    37                 type:"post",
    38                 data:formData,
    39                 dataType:"json",
    40                 contentType:false,
    41                 processData:false,
    42                 xhr:function(){
    43                     var myXhr=$.ajaxSettings.xhr();
    44                     if(myXhr.upload){
    45                         myXhr.upload.addEventListener("progress",function(event){
    46                             var loadedSize=event.loaded;
    47                             var loadSize=event.total;
    48                             var precent=Math.floor(100*(loadedSize/loadSize))+"%";
    49                             $("#content").css("width",precent);
    50                         },false);
    51                     }
    52                     return myXhr;
    53                 },
    54                 success:function(result){
    55                     if(result.data=="success"){
    56                         $("#p").text("上传成功!");
    57                     }else{
    58                         $("#p").text("上传失败!");
    59                     }
    60                 },
    61                 error:function(){
    62                     alert("服务器内部错误!");
    63                 }
    64             });
    65         });
    66 
    67     })
    68 </script>
    69 </html>

    servlet代码:

     1 package servlet;
     2 
     3 import com.alibaba.fastjson.JSONObject;
     4 import org.apache.commons.fileupload.FileItem;
     5 import org.apache.commons.fileupload.FileUploadException;
     6 import org.apache.commons.fileupload.ProgressListener;
     7 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
     8 import org.apache.commons.fileupload.servlet.ServletFileUpload;
     9 
    10 import javax.servlet.ServletException;
    11 import javax.servlet.annotation.WebServlet;
    12 import javax.servlet.http.HttpServlet;
    13 import javax.servlet.http.HttpServletRequest;
    14 import javax.servlet.http.HttpServletResponse;
    15 import java.io.File;
    16 import java.io.IOException;
    17 import java.io.PrintWriter;
    18 import java.util.List;
    19 import java.util.UUID;
    20 
    21 @WebServlet(value = "/listenerUpload.do")
    22 public class ListenerUploadServlet extends HttpServlet {
    23     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    24         PrintWriter out=response.getWriter();
    25         JSONObject jsonObject=new JSONObject();
    26         boolean flag=false;
    27         if(ServletFileUpload.isMultipartContent(request)){
    28             DiskFileItemFactory factory=new DiskFileItemFactory();
    29             factory.setSizeThreshold(1024000000);
    30             factory.setRepository(new File("D:\\res"));
    31             ServletFileUpload upload=new ServletFileUpload(factory);
    32             upload.setFileSizeMax(1024000000);
    33             upload.setSizeMax(1024000000);
    34             ProgressListener progressListener=new ProgressListener() {
    35                 @Override
    36                 public void update(long readByte, long totalByte, int i) {
    37                     System.out.println("已读字节:"+readByte+",总字节数:"+totalByte+",文件序号:"+i);
    38                 }
    39             };
    40             upload.setProgressListener(progressListener);
    41             try {
    42                 List<FileItem> fileItems=upload.parseRequest(request);
    43                 for(FileItem f:fileItems){
    44                     if(!f.isFormField()){
    45                         File file=new File("D:\\upload\\"+ UUID.randomUUID()+f.getName().substring(f.getName().lastIndexOf(".")));
    46                         f.write(file);
    47                         flag=true;
    48                     }else{
    49                         System.out.println("表单名:"+f.getFieldName()+" 输入值:"+f.getString("UTF-8"));
    50                     }
    51                 }
    52             } catch (FileUploadException e) {
    53                 e.printStackTrace();
    54             } catch (Exception e){
    55                 e.printStackTrace();
    56             }
    57         }
    58         if(flag){
    59             jsonObject.put("data","success");
    60         }else{
    61             jsonObject.put("data","error");
    62         }
    63         out.write(jsonObject.toString());
    64     }
    65 
    66     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    67         this.doPost(request,response);
    68     }
    69 }

    第二种方法:通过session存储文件上传进度

    jsp页面代码:

     1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
     2 <html>
     3 <head>
     4     <title>文件上传</title>
     5     <script src="js/jquery-1.11.3.min.js"></script>
     6     <script>
     7         //编写jQuery语句
     8         $(function () {
     9             var flag;
    10             $("[type=button]").click(function () {
    11                 var formDate=new FormData($("#frm")[0]);
    12                 $.ajax({
    13                     type:"post",
    14                     url:"UploadServlet",
    15                     data:formDate,
    16                     dataType:"json",
    17                     contentType:false,
    18                     processData:false,
    19                     success:function (result) {
    20                         flag=result.data;
    21                         /*if(result.data=="1" && $("#proInfo").text()=="上传进度:100%"){
    22                             alert("上传成功!")
    23                         }*/
    24                     },
    25                     error:function () {
    26                         alert("服务器内部错误!");
    27                     }
    28                 });
    29 
    30                 var pro=null;
    31                 pro=setInterval(function(){
    32                     $.get("UploadServlet","",function(data){
    33                         if(data=='100%'){
    34                             clearInterval(pro);
    35                             $("#proInfo").text("上传进度:100%");
    36                             //更新进度条
    37                             $("#progress").width("100%");
    38 
    39                             setTimeout(function () {
    40                                 if(flag=="1"){
    41 
    42                                     alert("上传成功!");
    43                                 }
    44                             },300);
    45 
    46 
    47                         }else{//正在上传
    48                             //更新进度信息
    49                             $("#proInfo").text("上传进度:"+data);
    50                             //更新进度条
    51                             $("#progress").width(data);
    52                         }
    53                     });
    54                 },200);
    55             });
    56 
    57 
    58         });
    59     </script>
    60     <style>
    61         #progressBar{width: 300px;height: 20px;border: 1px #EEE solid;}
    62         #progress{width: 0%;height: 20px;background-color: green;}
    63     </style>
    64 </head>
    65 <body>
    66 <form id="frm" method="post">
    67     <p><input type="file" name="ff"></p>
    68     <p>
    69         <input type="button" value="上传">
    70         <div id="progressBar">
    71             <div id="progress"></div>
    72         </div>
    73         <span id="proInfo">上传进度:0%</span>
    74     </p>
    75 </form>
    76 
    77 </body>
    78 </html>

    servlet代码:

     1 package servlet;
     2 
     3 
     4 import test.MyProgressListener;
     5 import net.sf.json.JSONObject;
     6 import org.apache.commons.fileupload.FileItem;
     7 import org.apache.commons.fileupload.FileUploadException;
     8 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
     9 import org.apache.commons.fileupload.servlet.ServletFileUpload;
    10 
    11 import javax.servlet.ServletException;
    12 import javax.servlet.annotation.WebServlet;
    13 import javax.servlet.http.HttpServlet;
    14 import javax.servlet.http.HttpServletRequest;
    15 import javax.servlet.http.HttpServletResponse;
    16 import java.io.File;
    17 import java.io.IOException;
    18 import java.io.PrintWriter;
    19 import java.util.List;
    20 import java.util.UUID;
    21 
    22 @WebServlet(value = "/UploadServlet")
    23 public class UploadServlet extends HttpServlet {
    24     @Override
    25     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    26         //取出监听器MyProgress在session中保存的进度信息
    27         String progress=(String) request.getSession().getAttribute("progress");
    28         //响应
    29         response.getWriter().print(progress);
    30         //清除session中保存的数据
    31        //request.getSession().removeAttribute("progress");
    32     }
    33 
    34     @Override
    35     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    36        response.setContentType("text/html");
    37         PrintWriter out = response.getWriter();
    38         JSONObject json=new JSONObject();
    39         /**
    40          * 1.判断请求是否为multipart
    41          * 2.创建磁盘工厂,设置内存大小和临时存储位置
    42          * 3.创建ServletFileUpload设置单个文件上传大小以及整个request域大小
    43          * 4.创建ProgressListener对象监听文件上传进度
    44          * 5.解析request域
    45          */
    46         int sign=0;
    47         //判断请求是否为multipart
    48         if(ServletFileUpload.isMultipartContent(request)){
    49             //创建磁盘工厂,设置内存大小和临时存储位置
    50             DiskFileItemFactory factory=new DiskFileItemFactory();
    51             //factory.setSizeThreshold(10240000);
    52             //如果文件大小大于内存大小则存储在临时存储空间
    53             factory.setRepository(new File("D:\\res"));
    54             //创建ServletFileUpload设置单个文件上传大小以及整个request域大小
    55             ServletFileUpload upload=new ServletFileUpload(factory);
    56             //upload.setFileSizeMax(10240000);
    57             //upload.setSizeMax(10240000);
    58             //创建ProgressListener对象监听文件上传进度
    59             upload.setProgressListener(new MyProgressListener(request));
    60 
    61             //解析request域
    62             try {
    63                 List<FileItem> fileItems=upload.parseRequest(request);
    64                 for (FileItem f:fileItems){
    65                     if(!f.isFormField()){//判断是否是普通表单域,如果是普通表单域则解析不了
    66                         File file=new File("D:\\upload\\"+ UUID.randomUUID()+f.getName().substring(f.getName().lastIndexOf(".")));
    67                         f.write(file);
    68                         sign++;
    69                         json.put("data",sign);
    70                     }else {
    71                         System.out.println("表单名:"+f.getFieldName()+"    输入值:"+f.getString("UTF-8"));
    72                     }
    73                 }
    74             } catch (FileUploadException e) {
    75                 e.printStackTrace();
    76             } catch (Exception e){
    77                 e.printStackTrace();
    78             }
    79         }
    80         out.write(json.toString());
    81 
    82 }
    83 }

    监听器MyProgressListener类代码:

     1 package test;
     2 
     3 import org.apache.commons.fileupload.ProgressListener;
     4 
     5 import javax.servlet.http.HttpServletRequest;
     6 import javax.servlet.http.HttpSession;
     7 import java.text.NumberFormat;
     8 
     9 
    10 public class MyProgressListener implements ProgressListener {
    11 
    12     private HttpSession session;
    13     public MyProgressListener(HttpServletRequest request){
    14         session = request.getSession();
    15     }
    16 
    17     @Override
    18     public void update(long pBytesRead, long pContentLength, int pItems) {
    19         //将数据进行格式化
    20         //已读取数据由字节转换为M
    21         double readM=pBytesRead/1024.0/1024.0;
    22         //已读取数据由字节转换为M
    23         double totalM=pContentLength/1024.0/1024.0;
    24         //已读取百分百
    25         double percent=readM/totalM;
    26 
    27         //格式化数据
    28         //已读取
    29         String readf=dataFormat(pBytesRead);
    30         //总大小
    31         String totalf=dataFormat(pContentLength);
    32         //进度百分百
    33         NumberFormat format=NumberFormat.getPercentInstance();
    34         String progress=format.format(percent);
    35 
    36         //将信息存入session
    37         session.setAttribute("progress", progress);
    38 
    39         //打印消息到控制台
    40         System.out.println("pBytesRead===>"+pBytesRead);
    41         System.out.println("pContentLength==>"+pContentLength);
    42         System.out.println("pItems===>"+pItems);
    43         System.out.println("readf--->"+readf);
    44         System.out.println("totalf--->"+totalf);
    45         System.out.println("progress--->"+progress);
    46     }
    47 
    48     /**
    49      * 格式化读取数据的显示
    50      * @param data 要格式化的数据 单位byte
    51      * @return 格式化后的数据,如果小于1M显示单位为KB,如果大于1M显示单位为M
    52      */
    53     public String dataFormat(double data){
    54         String formdata="";
    55         if (data>=1024*1024) {//大于等于1M
    56             formdata=Double.toString(data/1024/1024)+"M";
    57         }else if(data>=1024){//大于等于1KB
    58             formdata=Double.toString(data/1024)+"KB";
    59         }else{//小于1KB
    60             formdata=Double.toString(data)+"byte";
    61         }
    62         return formdata.substring(0, formdata.indexOf(".")+2);
    63     }
    64 }
  • 相关阅读:
    ruia笔记
    一个有趣的小例子,带你入门协程模块-asyncio
    python标准库之secrets
    转载:(Mac)在bash和zsh配置环境变量path的几种方法
    mac安装mysql8.0的错误
    Mac下的安装 mongodb
    mac 安装zsh教程资料
    mac 报错Root chmod operation not permitted on file
    喝奶粉的宝宝一天喝多少水 奶粉喂养的宝宝每天要喝多少水
    洗碗机耗材:finish 亮碟 产品的选购
  • 原文地址:https://www.cnblogs.com/leafarmyarmy/p/10431501.html
Copyright © 2011-2022 走看看