Servlet上传zip文件并解压

来源:互联网 发布:随机抽取数字软件 编辑:程序博客网 时间:2024/05/21 21:43

根据需要写一个上传文件的小程序,比较简单就用serlvet写。首先是要上传文件到服务器,然后是解压删除zip包。同时写一个监听器,用于进度条展现上传进度。


首先是页面Upload.jsp:前台需要上传一个文件和上传文件名称(对应服务器的相应目录),Ajax提交请求以实现进度条变化。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>上传文件</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script src="./js/jquery-1.11.1.min.js" type="text/javascript"></script>


</head>
<body>
<form action="servlet/UploadServletMy"  method="post" id="form" enctype="multipart/form-data">
<div align="center">
    <fieldset style="width:80%">
        <legend>文件上传</legend><br/>
        <div class='line'>
            <div align='left' ></div>
            <div align='left' >
             <select name="select" id="select_k1" class="xla_k">
             <option value="tjgb">统计公报</option>
             <option value="dycqgslpcgb">第一次全国水利普查公报</option>
             <option value="slfztjgb">水利发展统计公报</option>
             <option value="szygb">水资源公报</option>
             <option value="zghlnsgb">中国河流泥沙公报</option>
             <option value="slkjcggb">水利科技成果公报</option>
             <option value="zgshzhgb">中国水旱灾害公报</option>
             <option value="zgstbcgb">中国水土保持公报</option>
             <option value="swxytjnb">水文行业统计年报</option>
             <option value="sqnb">水情年报</option>
             <option value="dxsdtyb">地下水动态月报</option>
             <option value="zysljstztjyb">中央水利建设投资统计月报</option>
             <option value="xxbxskcxjgtb">小型病险水库除险加固通报</option>
             <option value="ncsdnb">农村水电年报</option>
             </select>  
             <input type="file" name="file1" id="file1" value=""></input>
             
            </div>
        </div>
        <!--  <input type="text" name="username" id="username" class="text" /> -->
                 
        <!--  <div class='line'>
            <div align='left' class="leftDiv">文件说明(文字域)</div>
            <div align='left' class="rightDiv"><input type="text" name="description1" value="description1"/></div>
        </div> -->
        <div class='line'>
            <div align='left' ><br/><br/><br/>
            <input type="button" value="点击上传"  onclick="formSubmit();" />
                </div>
            <div align='left' ><br/>
                
                <div style="width:300px;">  
                <div id="show" style="background:#ADFF2F;height:26px;width:0%;"></div>  
                </div>  
                <span id="msg"></span>
            </div>
        </div>


    </fieldset>
</div>


</form>  
</body>
<script language="javascript">
  var progress;  
  var uploadProcessTimer = null;  
function getFileUploadProcess() {   
              $.ajax({  
                     type:"POST",  
                     url:"servlet/fileUploadStatusServlet",  
                     dataType:"text",  
                     cache:false,  
                     success:function(data){ 
                              
                         if(data=="100%"){  
                             window.clearInterval(uploadProcessTimer);  
                         }else{  
                              progress=data;  
                             $("#show").width(data);  
                             $("#msg").text(data);  
                         }  
                     }  
             });  
          };             
function formSubmit(){  


var str;
str=$('#file1').val();
var arr=str.split("\\");//注split可以用字符或字符串分割
var my=arr[arr.length-1];//这就是要取得的图片名称
var reg = new RegExp("[\\u4E00-\\u9FFF]+","g");
if(reg.test(arr)){
   alert("上传文件包含中文名字,请修正后上传!");
   return;
}else{
   /*  var act="servlet/UploadServletMy";     
    url =act+"?username="+document.getElementById("select_k1").value; 
    $('form').attr('action',url);      */     
    $("form").submit();  
    timer=self.setInterval("getFileUploadProcess()",10);
  }
}  
</script>
</html>

然后是文件上传的serlvet:UploadServletMy.java  request请求包含了文件类型的input和select下拉菜单,遍历判断顺序应该和jsp页面顺序对应,保证pathR的值

不为空。

package com.helloweenvsfei.servlet;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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 UploadServletMy extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.getWriter().println("请以 POST 方式上传文件");
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

File file1 = null;
//String description1 = null;
String pathL ="E:/wz/webhomenew/mwr2016/zzsc/tjgb/";
/*String pathR = request.getParameter("username");
System.out.println("select:"+pathR);
String path =pathL+pathR;*/
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();

DiskFileItemFactory factory= new DiskFileItemFactory();

//临时文件暂存的路径
File tmpFile = new File(getServletContext().getRealPath("/WEB-INF/")+"/tmp");

if(!tmpFile.exists())
{
tmpFile.mkdir();
}
//缓存临时文件
factory.setRepository(tmpFile);
ServletFileUpload sfu= new ServletFileUpload(factory);
//文件上传进度的监听
UploadProgressListener listener=new UploadProgressListener(request);
sfu.setProgressListener(listener);
// 使用 DiskFileUpload 对象解析 request
// DiskFileUpload diskFileUpload = new DiskFileUpload();
try {
// 将 解析的结果 放置在 List 中
List<FileItem> list = sfu.parseRequest(request);
out.println("遍历所有的 FileItem ... <br/>");
// 遍历 list 中所有的 FileItem
System.out.println("request请求信息数:"+list.size());;
for(FileItem fileItem : list){
if(fileItem.isFormField()){
// 如果是 文本域
pathR=new String(fileItem.getString().getBytes("iso8859-1"),"utf-8")+"/";
System.out.println("普通内容:"+fileItem.getFieldName()+"值为:"+pathR);
}
else{
// 否则,为文件域
if("file1".equals(fileItem.getFieldName())){
// 客户端文件路径构建的 File 对象
File remoteFile = new File(new String(fileItem.getName().getBytes(), "UTF-8"));
out.println("遍历到 file1 ... <br/>"+new String(fileItem.getName().getBytes(), "UTF-8"));
// out.println("客户端文件位置: " + remoteFile.getAbsolutePath() + "<br/>");
// 服务器端文件,放在 upload 文件夹下
System.out.println(remoteFile.getName());

/* Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = p.matcher(remoteFile.getName());
//判断上传文件名字是否包含中文
if(m.find()){
out.println("文件名称不符合规则");
out.println("<a href='javascript:'onclick='self.location=document.referrer;'>返回上一页</a>");
return;
} */
System.out.println("pathR:"+pathR);
file1 = new File("D:/temp/aaa/"+remoteFile.getName());
if(file1.exists()){
System.out.println("文件已存在,路径为:"+file1.getAbsolutePath());
out.println("文件已存在。");
out.println("<a href='javascript:'onclick='self.location=document.referrer;'>返回上一页</a>");
return;
}
file1.createNewFile();

System.out.println(file1.getAbsolutePath());
System.out.println(remoteFile.getName());
file1.getParentFile().mkdirs();
file1.createNewFile();

// 写文件,将 FileItem 的文件内容写到文件中
InputStream ins = fileItem.getInputStream();
FileOutputStream ous = new FileOutputStream(file1);
try{

byte[] buffer = new byte[1024];
int len = 0;
while((len=ins.read(buffer)) > -1){
ous.write(buffer, 0, len);
}
ous.close();
out.println("已保存文件" + file1.getAbsolutePath() + "<br/>");
} finally{

ins.close();
}
}
}
}
out.println("Request 解析完毕");
} catch (Exception e) { //FileUploadException
// TODO Auto-generated catch block
e.printStackTrace();
e.getMessage();
}
HttpSession session=request.getSession();
session.setAttribute("file", file1);
session.setAttribute("pathR", pathR);
request.getRequestDispatcher("/servlet/FileUnzipServlet").forward(request,response);
out.flush();
out.close();

}

}

接着是解压zip的serlvet:FileUnzipServlet.java


package com.helloweenvsfei.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
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 com.doczip.ZipDecompressing;


public class FileUnzipServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       response.setCharacterEncoding("UTF-8");
       response.getWriter().println("请以 POST 方式上传文件");
   }


   @SuppressWarnings("unchecked")
   public void doPost(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
     
    response.setCharacterEncoding("UTF-8");
       response.setContentType("text/html");
       PrintWriter out = response.getWriter();
       HttpSession session=request.getSession();  
      File   file1 = (File) session.getAttribute("file");
      String pathR = (String) session.getAttribute("pathR");
 //上传后解压zip文件
        if(file1.getAbsolutePath().contains(".zip")){
        File zipFile = new File(file1.getAbsolutePath());  
        String pathZip = "D:/temp/aaa/"; 
        File pathFile = new File(pathZip);
        File temp = null;
        File[] filelist = pathFile.listFiles();
        String zipFileName = zipFile.getName();
        String prefix=zipFileName.substring(zipFileName.lastIndexOf("."));
        String checkname =zipFileName.substring(0, zipFileName.length()-prefix.length());
        System.out.println("名字名字"+checkname);
        
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <link rel='stylesheet' type='text/css' href='../css/style.css'>");
        out.println("  <BODY>");


        out.println("<div align=center><br/>");
        out.println("<fieldset style='width:90%'><legend>上传文件</legend><br/>");


        out.println("       <div class='line'>");
        out.println("           <div align='left' class='leftDiv'>上传日志:</div>");
        out.println("           <div align='left' class='rightDiv'>");
        for (int i = 0; i < filelist.length; i++) {
            temp = filelist[i];
            System.out.println(temp.getName());
            if (temp.getName().equals(checkname)) {// 获得文件名,如果后缀为“”,checkname,就删除文件
            file1.delete();
            System.out.println("此文件已存在,请手动覆盖至服务器!");
            out.println(" 此文件已存在,请手动覆盖至服务器!");
            out.println("<a href='http://www.mwr.gov.cn/zzsc/tjgb/" + pathR +"/"+ checkname + "' target=_blank>" + file1.getName() +  "文件链接地址</a>");
            out.println("<a href='javascript:'onclick='self.location=document.referrer;'>返回上一页</a>");
               return ;
                        }
                          }
       //解压文件删除zip 
        ZipDecompressing.unZipFiles(zipFile, pathZip); 
        file1.delete();
       /* request.getRequestDispatcher("/result.jsp").forward(request, response);*/
        out.println("           </div>");
        out.println("       </div>");
        
        if(file1 != null){
        out.println("       <div class='line'>");
        out.println("           <div align='left' class='leftDiv'>file1:</div>");
        out.println("           <div align='left' class='rightDiv'>");
        out.println("               <a href='http://www.mwr.gov.cn/zzsc/tjgb/" + pathR +"/"+ checkname + "' target=_blank>" + file1.getName() +  "文件链接地址</a>"   );
        out.println("           </div>");
        out.println("       </div>");
        }
        out.println("       <div class='line'>");
        out.println("           <div align='left' class='leftDiv'>description1:</div>");
        out.println("           <div align='left' class='rightDiv'>");
        out.println("<a href='javascript:'onclick='self.location=document.referrer;'>返回上一页</a>");
        out.println("           </div>");
        out.println("       </div>");
        out.println("</fieldset></div>");


        out.println("  </BODY>");
        out.println("</HTML>"); }


}
}




package com.helloweenvsfei.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
* 文件上传进度状态类
* @author
*
*/

public class fileUploadStatusServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doPost(request,response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");

HttpSession session=request.getSession();

Object status = session.getAttribute("key");//获取上传进度百分比
if(status==null) return;
PrintWriter out = response.getWriter();
out.write(status.toString());
out.flush();
out.close();

}

}



package com.helloweenvsfei.servlet;  
  
import java.text.NumberFormat;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpSession;  
  
import org.apache.commons.fileupload.ProgressListener;  
  
public class UploadProgressListener implements ProgressListener {  
      
    private HttpSession session;  
    private long kiloBytes=-1;  
      
    public UploadProgressListener(HttpServletRequest request) {  
          
        this.session = request.getSession();  
    }  
  
    //pBytes  
    public void update(long PBytesRead, long PContentLength, int PItems) {  
      
        Long KBytes=PBytesRead/1024;  
        if(kiloBytes==KBytes)  
        {  
            return;  
        }  
        kiloBytes=KBytes;  
        System.out.println("正在读取项目"+KBytes);  
        if(PContentLength==-1)  
        {  
            System.out.println("目前已经读取了"+PBytesRead+"字节数据");  
        }  
        else  
        {  
            System.out.println("目前已经读取了"+PContentLength+"中的"+PBytesRead+"字节数据");  
        }  
        //获取上传进度的百分比  
        double read=((double)KBytes)/(PContentLength/1024);  
          
          
        NumberFormat nf=NumberFormat.getPercentInstance();  
          
        session.setAttribute("key", nf.format(read));  
          
        System.out.println("进度时间:"+nf.format(read));  
          
    }  
}

原创粉丝点击