利用commons-fileupload实现文件的上传(源码)

来源:互联网 发布:淘宝已评价管理在哪里 编辑:程序博客网 时间:2024/05/18 00:56

现在我们利用commons-fileupload实现文件的上传,

开发环境:Myeclipse 9.0  

对文件上传的细节分析:

1、乱码问题的出现与解决       2、上传文件类型的约束       3、上传文件的大小约束

4、临时缓存文件的处理           5、服务器端文件的保存        6、文件名相同覆盖问题

7、多文件同时上传问题    等…………

实现:

在Myeclipse 9.0  创建一个web project  ,新建一个jsp命名为:myupload.jsp

源码:

[java] view plaincopy
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%  
  3.     String path = request.getContextPath();  
  4.     String basePath = request.getScheme() + "://"  
  5.             + request.getServerName() + ":" + request.getServerPort()  
  6.             + path + "/";  
  7. %>  
  8.   
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  10. <html>  
  11.     <head>  
  12.         <base href="<%=basePath%>">  
  13.   
  14.         <title>文件上传</title>  
  15.   
  16.         <meta http-equiv="pragma" content="no-cache">  
  17.         <meta http-equiv="cache-control" content="no-cache">  
  18.         <meta http-equiv="expires" content="0">  
  19.         <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  20.         <meta http-equiv="description" content="This is my page">  
  21.           
  22.     <script type="text/javascript" src="addelement.js"></script>  
  23.   
  24.     </head>  
  25.   
  26.     <body>  
  27.         <form  
  28.             action="${pageContext.request.contextPath}/servlet/UploadServlet"  
  29.             method="post" enctype="multipart/form-data">  
  30.             <input type="hidden" name="hidden" value="1" id="hidden">  
  31.             用户:  
  32.             <input type="text" name="user">  
  33.                  
  34.             <input type="button" value="上传文件" onclick="addElement()">  
  35.                  
  36.             <input type="button" value="删除" onclick="deleteElement()">  
  37.             <div id="upload_div" style="width: 300px;">  
  38.             </div>  
  39.             <input type="submit" value="提交">  
  40.         </form>  
  41.   
  42.     </body>  
  43. </html>  

需要主要的是:from里面用到了一个隐藏的input用来标记file项。这里还引用了一个名为:addelement.js的javascript文件,用来实现动态添加和删除上传文件的项。


addelement的源码:

[javascript] view plaincopy
  1. <span style="white-space:pre">  </span>function addElement() {  
  2.         //得到隐藏input里面的value值  
  3.         var index = document.getElementById("hidden").getAttribute("value");  
  4.         if(index>4){  
  5.             alert("最大同时上传4个文件");  
  6.             return false;  
  7.         }  
  8.   
  9.         //创建一个input类型的节点  
  10.         var inputElement = document.createElement("input");  
  11.         //设置新创建的节点的属性,类型为file,name值递增  
  12.         inputElement.setAttribute("type""file");  
  13.         inputElement.setAttribute("name""file" + index);  
  14.   
  15.         //创建文本节点  
  16.         var fontElement = document.createTextNode("选择文件:");  
  17.         //将创建的文本节点添加到div中  
  18.         document.getElementById("upload_div").appendChild(fontElement);  
  19.   
  20.         //将创建的input类型的节点添加到div中  
  21.         document.getElementById("upload_div").appendChild(inputElement);  
  22.   
  23.         //创建一个换行  
  24.         var brElement = document.createElement("br");  
  25.         //添加到div中  
  26.         document.getElementById("upload_div").appendChild(brElement);  
  27.         //将隐藏input里面的value值加1  
  28.         document.getElementById("hidden").setAttribute("value",  
  29.                 parseInt(index) + 1);  
  30.     }  
  31.   
  32.     function deleteElement() {  
  33.         //因为add方法添加了3个节点循环三次  
  34.         for ( var i = 0; i < 3; i++) {  
  35.             //删除最后一个节点  
  36.             document.getElementById("upload_div").removeChild(  
  37.                     document.getElementById("upload_div").lastChild);  
  38.         }  
  39.         //将隐藏input里面的value值设为1  
  40.         document.getElementById("hidden").setAttribute("value",1);  
  41.     }  
在jsp页面中引入js文件时,可能会出现乱码。原因,因为在Myeclipse下文件保存的默认编码是本地的默认编码,一般是GBK,而jsp页面保存的时候

指定了编码"UTF-8"的方式。

解决方法,1、在引入js时指定js的编码方式(js的保存方式),<script type="text/javascript" src="addelement.js" charset="GBK"></script>即可。

2、在Myeclipse下右击js文件选择Properties项,在Text file encoding中选择other 在选择UTF-8即可。这时再打开js文件里面的汉字都成了乱码,删除

乱码汉字重新编写一下即可。

创建一个人servlet包,在包中创建一个servlet用来处理提交的表单:

UploadServlet源码:

[java] view plaincopy
  1. package cn.zc.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.PrintWriter;  
  8. import java.util.Arrays;  
  9. import java.util.List;  
  10. import java.util.UUID;  
  11.   
  12. import javax.servlet.ServletException;  
  13. import javax.servlet.http.HttpServlet;  
  14. import javax.servlet.http.HttpServletRequest;  
  15. import javax.servlet.http.HttpServletResponse;  
  16.   
  17. import org.apache.commons.fileupload.FileItem;  
  18. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  19. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  20.   
  21. public class UploadServlet extends HttpServlet {  
  22.   
  23.     /** 
  24.      * Constructor of the object. 
  25.      */  
  26.       
  27.     public UploadServlet() {  
  28.         super();  
  29.     }  
  30.   
  31.     /** 
  32.      * Destruction of the servlet. <br> 
  33.      */  
  34.     public void destroy() {  
  35.         super.destroy(); // Just puts "destroy" string in log  
  36.         // Put your code here  
  37.     }  
  38.   
  39.   
  40.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  41.             throws ServletException, IOException {  
  42.         doPost(request,response);  
  43.     }  
  44.   
  45.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  46.             throws ServletException, IOException {  
  47.           
  48.         //判断表格的提交方式是否是multipart/form-data类型  
  49.         if(!ServletFileUpload.isMultipartContent(request)){  
  50.             //如果不是该类型,采用普通方式处理。  
  51.             //response.setContentType("text/html;charset=utf-8");  
  52.             //PrintWriter out = response.getWriter();  
  53.             //request.getParameter("user");//此时便可以使用request.getParameter方法  
  54.             //为了方便在此直接退出  
  55.             return ;  
  56.         }  
  57.           
  58.         //创建一个解析工厂  
  59.         DiskFileItemFactory factory=new DiskFileItemFactory();  
  60.         //设置临时缓存文件的保存目录  
  61.         factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));  
  62.           
  63.         //得到解析器对象  
  64.         ServletFileUpload upload=new ServletFileUpload(factory);  
  65.         //设置保存文件的编码方式,  
  66.         upload.setHeaderEncoding("UTF-8");  
  67.         try{  
  68.             //设置上传文件的最大值大小,最大值为200MB  
  69.             upload.setFileSizeMax(1024*1024*200);  
  70.               
  71.             //定义规定上传文件的类型  
  72.             String[]arr={".jpg",".zip",".txt",".ppt",".pptx",".doc",".docx",".xls",".gif"};  
  73.             //将类型放到List中  
  74.             List fileStandType=Arrays.asList(arr);  
  75.             //对请求进行解析,有几个输入项就会有几个FileItem对象  
  76.             List<FileItem> items=upload.parseRequest(request);  
  77.               
  78.             for(FileItem item:items){  
  79.                 //判断输入元素的类型,  
  80.                 if(item.isFormField()){//是普通项  
  81.                     //得到name属性  
  82.                     String inputName=item.getFieldName();  
  83.                     //得到相对应的值  
  84.                     String inputValue=item.getString("UTF-8");//可指定字符编码,以防乱码  
  85.                     System.out.println(inputName+" : "+inputValue);  
  86.                 }else{//是上传文件输入项  
  87.                     //获取上传文件名称  
  88.                     String fileName=item.getName();  
  89.                     //判断fileName是否为空即是否真的选择了上传文件,不为空继续  
  90.                     if(!fileName.trim().equals("")){  
  91.                         //对文件名进行处理得到文件名  
  92.                         fileName=fileName.substring(fileName.lastIndexOf("\\")+1);  
  93.                         //得到文件后缀判断文件类型  
  94.                         String fileType=fileName.substring(fileName.lastIndexOf("."));  
  95.                         //判断是否是制定的文件类型  
  96.                         if(!fileStandType.contains(fileType)){  
  97.                             //如果不是制定类型的文件跳转页面,  
  98.                             request.setAttribute("fileTypeError","只能上传指定类型的文件,jpg/zip/txt/ppt/pptx/docx/doc/xls/gif");  
  99.                             request.getRequestDispatcher("/handler.jsp").forward(request, response);  
  100.                             return ;  
  101.                         }  
  102.                         //文件已选择,得到输入流  
  103.                         InputStream in=item.getInputStream();  
  104.                         //将上传的文件保存在服务器受保护的WEB-INF的目录下,  
  105.                         String savePath=this.getServletContext().getRealPath("WEB-INF/upload");  
  106.                         savePath=getFilePath(savePath,fileName);  
  107.                         //同名文件覆盖问题对fileName进行进一步处理,工具类UUID  
  108.                         fileName=UUID.randomUUID().toString()+"_"+fileName;  
  109.                         //构建输出流  
  110.                         FileOutputStream fos=new FileOutputStream(savePath+"\\"+fileName);  
  111.                         byte[] buffer=new byte[1024];  
  112.                         //int len=0;  
  113.                         while(in.read(buffer)>0){  
  114.                             fos.write(buffer);  
  115.                             fos.flush();  
  116.                         }  
  117.                         in.close();  
  118.                         fos.close();  
  119.                         request.setAttribute("finish","上传成功!");  
  120.                         item.delete();//在关闭流之后,删除临时缓存文件  
  121.                     }  
  122.                 }  
  123.             }  
  124.               
  125.         }catch(Exception e){  
  126.             request.setAttribute("finish","上传失败!");  
  127.         }  
  128.         request.getRequestDispatcher("/handler.jsp").forward(request, response);  
  129.     }  
  130.       
  131.     //方法对文件保存目录进行处理,  
  132.     public String getFilePath(String path,String fileName){  
  133.         //产生目录结构的算法:hash目录  
  134.         int dir1=fileName.hashCode()&0x0f;//一级目录  
  135.         int dir2=fileName.hashCode()>>4 &0x0f;//二级目录  
  136.         String savePath=path+"\\"+dir1+"\\"+"\\"+dir2;  
  137.         File file=new File(savePath);  
  138.         if(!file.exists()){  
  139.             file.mkdirs();  
  140.         }  
  141.         return savePath;  
  142.     }  
  143.       
  144.       
  145.     public void init() throws ServletException {  
  146.         // Put your code here  
  147.     }  
  148.   
0 0
原创粉丝点击