最近Java项目上有个文件上传的功能需求,当然有上传就存在对应的下载需求。由于项目的框架由前辈搭建好了,对于功能上的需求就直接往框架中添加模块,完全采用CTRL+C/V的方式在已有的代码上做相应的修改,没撒技术含量,就这个小的功能需求对于目前这种景况也算是一个插曲 – 需要自己实现。

通过多天的代码编写与测试,终于完成对上传/下载的实现,先将其过程详细记录,以备后续总结。
工具:JBuilder 2006
WEB环境:tomcat 5.5(可以是JBuilder2006自带,亦可以是单独的tomcat软件)
实现方式:主要采用Servlet方式完成。

首先,实现Servlet代码如下:
上传代码:

 
  
  1. package com.vspeed.servlet.util;  
  2.  
  3. import javax.servlet.http.*;  
  4. import java.io.*;  
  5.  
  6. public class ToolUpload extends HttpServlet {  
  7.     public ToolUpload() {  
  8.         super();  
  9.     }  
  10.  
  11. //该方法完成对一个或一个以上文件的上传,无大小,格式限制  
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response) {  
  13.         response.setCharacterEncoding("GBK");  
  14.         try {  
  15.             javax.servlet.ServletInputStream input = request.getInputStream();  
  16.             String direct = getServletContext().getRealPath("\\") + "files", //设置服务器附件保存文件夹  
  17.             //path = request.getRequestURI();//该方法在1.2以后就不建议使用  
  18.             path = path.substring(0, path.indexOf("/servlet"));  
  19.             java.io.File file = new java.io.File(direct);  
  20.             if (!file.exists()) file.mkdir(); //不存在文件夹则创建  
  21.             long fileName = System.currentTimeMillis();//获取系统时间,保证文件名的唯一性  
  22.             DataOutputStream pw = null;  
  23.             byte[] content = new byte[request.getContentLength()];  
  24.             int length = input.readLine(content, 0, content.length), loop = 1//获取第一行信息  
  25.             java.util.Map<String, String> map = new java.util.HashMap<String, String>();  
  26.             String head = new String(content, 0, length - 1).replaceAll("-""").replaceAll("\r"""); //第一行字符串  
  27.             String tmpFileName = "", strExtentType = "";  
  28.             while ((length = input.readLine(content, 0, content.length)) != -1) { //获取上传文件名  
  29.                 tmpFileName = new String(content, 0, length - 1);  
  30.                 tmpFileName = tmpFileName.substring(tmpFileName.lastIndexOf("\\") + 1);  
  31.                 strExtentType = tmpFileName.substring(tmpFileName.lastIndexOf("."));  
  32.                 if (!map.containsKey(fileName + "-" + String.format("%03d", loop)))  
  33.                     map.put(fileName + "-" + String.format("%03d", loop), tmpFileName.replaceAll("\""""));  
  34.                 input.readLine(content, 0, content.length);  
  35.                 input.readLine(content, 0, content.length);  
  36.                 tmpFileName = direct + "\\" + fileName + "-" + String.format("%03d", loop) + strExtentType.replaceAll("\"\r""");  
  37.                 pw = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(tmpFileName)));  
  38.                 while ((length = input.readLine(content, 0, content.length)) != -1) {  
  39.                     if ((new String(content, 0, length - 1)).indexOf(head) > 0break;  
  40.                     pw.write(content, 0, length);  
  41.                 }  
  42.                 pw.close();  
  43.                 pw = null;  
  44.                 loop++;  
  45.             }  
  46.             if (pw != null) pw.close();  
  47.             response.getWriter().println("<center><hl>Test For Upload File(s)</h1>");  
  48.             response.getWriter().println("<hr />");  
  49.             String label = "文件上传成功!\\n完成" + map.size() + "个文件的上传";  
  50.             if (map.size() == 0) label = "文件上传失败!";  
  51.             if (map.size() > 0) {  
  52.                 response.getWriter().println("<table><thead>" + "<tr><td colspan=3 align=center>上传文件信息</td></tr>" +  
  53.                         "<tr><td align=center>序号</td><td align=center>上传后的文件名</td>" +  
  54.                         "<td align=center>上传文件名</td></tr></thead><tbody>");  
  55.                 for (loop = 0; loop < map.keySet().toArray().length; loop++) {  
  56.                     response.getWriter().println("<tr><td align=center>" + (loop + 1) + "</td>");  
  57.                     String key = (String) map.keySet().toArray()[loop], name = map.get(key);  
  58.                     response.getWriter().println("<td>" + key + "</td>");  
  59.                     response.getWriter().println("<td><a href='/util/servlet/download?FileName=" + key + "." + name.substring(name.lastIndexOf(".") + 1) + "' >" + name + "</a></td>");  
  60.                     response.getWriter().println("</tr>");  
  61.                 }  
  62.                 response.getWriter().println("</tbody></table></center>");  
  63.             }  
  64.             response.getWriter().println("<script>alert('" + label + "');</script>");  
  65.         } catch (Exception ex) {  
  66.             ex.printStackTrace();  
  67.         }  
  68.     }  
  69.  
  70.     public void doPost(HttpServletRequest request, HttpServletResponse response) {  
  71.         doGet(request, response);  
  72.     }  
  73.  
  74.     public void process(HttpServletRequest request,  
  75.                         HttpServletResponse response) {  
  76.         doGet(request, response);  
  77.     }  

下载:

 
  
  1. package com.vspeed.servlet.util;  
  2.  
  3. import javax.servlet.http.*;  
  4. import java.net.URLEncoder;  
  5.  
  6. public class ToolDownLoad extends HttpServlet {  
  7.     public ToolDownLoad(){super();}  
  8.    //完成下载功能   
  9.    public void doGet(HttpServletRequest request, HttpServletResponse response){  
  10.     response.setCharacterEncoding("GBK");  
  11.     try{  
  12.         String strFile = request.getParameter("FileName");  
  13.         String path = getServletContext().getRealPath("\\") + "files";  
  14.         java.io.File file = new java.io.File(path + "\\" + strFile);  
  15.         if(!file.exists()){response.getWriter().println("<script>alert('附件信息不存在!'); </script>");return;}  
  16.         response.setContentType("application/x-msdownload"); //设置格式  
  17.         response.setHeader("Content-Dispostion""attchment;filename=" + strFile + "");  
  18.         java.io.FileInputStream input = new java.io.FileInputStream(file);  
  19.         int length = input.available();  
  20.         byte[] content = new byte[length];  
  21.         input.read(content);  
  22.         javax.servlet.ServletOutputStream out = response.getOutputStream();  
  23.         out.write(content);  
  24.         input.close();  
  25.         out.close();  
  26.     }catch(Exception ex){ex.printStackTrace();}  
  27.     }  
  28.     public void doPost(HttpServletRequest request, HttpServletResponse response){  
  29.         doGet(request, response);  
  30.     }  
  31.     public void process(HttpServletRequest request, HttpServletResponse response){  
  32.         doPost(request, response);  
  33.     }  

其次、配置Servlet,代码如下:

 
  
  1. <servlet> 
  2.  <!—上传 -->
  3.     <servlet-name>UtilUpload</servlet-name> 
  4.     <servlet-class>com.vspeed.servlet.util.ToolUpload</servlet-class> 
  5.   </servlet> 
  6.   <servlet-mapping> 
  7.     <servlet-name>UtilUpload</servlet-name> 
  8.     <url-pattern>/servlet/upload</url-pattern><!—注意这里的url-pattern的配置必须为/servlet/* -->
  9.   </servlet-mapping> 
  10.   <!—下载 -->
  11. <servlet> 
  12.     <servlet-name>ToolDownLoad</servlet-name> 
  13.     <servlet-class>com.vspeed.servlet.util.ToolDownLoad</servlet-class> 
  14.   </servlet> 
  15.   <servlet-mapping> 
  16.     <servlet-name>ToolDownLoad</servlet-name> 
  17.     <url-pattern>/servlet/download</url-pattern> 
  18.   </servlet-mapping> 

最后、页面代码,这里我主要采用javascript代码动态添加上传附件组件,代码如下:

 
  
  1. <%@ page contentType="text/html; charset=GBK" %> 
  2. <html> 
  3. <head> 
  4. <title> 
  5. Test4Upload  
  6. </title> 
  7. <script type="text/javascript"> 
  8. var fileName = <%=System.nanoTime() %>;  
  9.    function addItem(){  
  10.     var item = document.createElement('INPUT');  
  11.     item.type = 'file';  
  12.     var items = cpanel.rows.length;  
  13.     item.name = fileName + '-'+items ; //注意这里一定要设置组件的name属性,form文件上传只认name属性,理论上讲id也应该可以的,希望有朋友能帮忙解释哈,先谢~~~~~~  
  14.     item.id = 'file' + items;  
  15.     var tr = cpanel.insertRow();  
  16.     var cell = document.createElement('TD');  
  17.     cell.align = 'right';  
  18.     cell.innerText = '附件' + items + ':';  
  19.     tr.appendChild(cell);  
  20.     cell = document.createElement('TD');  
  21.     cell.appendChild(item);  
  22.     tr.appendChild(cell);  
  23.    }  
  24.   </script> 
  25. </head> 
  26. <body bgcolor="#ffffff"> 
  27. <center> 
  28. <h2> 
  29. JBuilder Generated JSP -- Test For Upload File(s)  
  30. </h2> 
  31.     <h3>测试时间:<%=new java.util.Date() %></h3> 
  32. <hr /> 
  33. <form method="post" action="/util/servlet/upload" enctype="multipart/form-data"><!-- 定要设置为multipart/form-data,上传文件必须为该类型 -->   
  34. <table id=cpanel> 
  35.     <tr style='display:none'><td>&nbsp;</td><td>&nbsp;</td> 
  36.     </tr> 
  37.     </table> 
  38.     <button id='btnAdd' onclick=addItem()>添加(T)</button> 
  39.     <input type=submit value=submit /><!--定要有该组件,并且不能通过javascript函数来完成点击 --> 
  40.     </form> 
  41. </center> 
  42. <div id="divDetail"></div> 
  43. </body> 
  44. </html> 

效果图如下:

 

                                                       文件上传界面

 

 

                                                       上传完成界面

注意,最后一列提供查看下载功能。

 

 

                                                         直接点击查看界面

 

                                                        右键另存为界面