javaWeb 实现上传+下载 文件

来源:互联网 发布:成捷讯通信概预算软件 编辑:程序博客网 时间:2024/06/07 10:50

上传下载在web项目中应该是很常见的需求,能够熟练敲出代码实现是web开发人员必不可少的

下面简化的上传:

jsp页面的实现:

[html] view plain copy print?
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%@ taglib uri = "http://java.sun.com/jsp/jstl/core"  prefix = "c" %>  
  3.   
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  5. <html>  
  6.   <head>  
  7.      
  8.     <title>My JSP 'uploadfile.jsp' starting page</title>  
  9.       
  10.     <meta http-equiv="pragma" content="no-cache">  
  11.     <meta http-equiv="cache-control" content="no-cache">  
  12.     <meta http-equiv="expires" content="0">      
  13.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  14.     <meta http-equiv="description" content="This is my page">  
  15.     <!-- 
  16.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  17.     -->  
  18.   
  19.   </head>  
  20.     
  21.   <body>  
  22.      <form action="<c:url value = '/UploadServlet1' />" method="post" enctype="multipart/form-data" >  
  23.         用户名:<input type = "text" name = "username">  
  24.         上传照片:<input type = "file" name = "photo">  
  25.         <input type = "submit" value="提交">  
  26.     </form>  
  27.   </body>  
  28. </html>  




servlet的实现:
[java] view plain copy print?
  1. package cn.Lionel.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.apache.commons.fileupload.FileItem;  
  13. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  14. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  15.   
  16. public class UploadServlet1 extends HttpServlet {  
  17.   
  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  19.             throws ServletException, IOException {  
  20.   
  21.         response.setContentType("text/html");  
  22.         //创建工厂  
  23.         DiskFileItemFactory factory = new DiskFileItemFactory() ;  
  24.         //通过工厂创建解析器  
  25.         ServletFileUpload upload = new ServletFileUpload(factory);  
  26.           
  27.         try {  
  28.             List<FileItem> list = upload.parseRequest(request);  
  29.             FileItem item1 = list.get(0);  
  30.             FileItem item2 = list.get(1);  
  31.               
  32.             System.out.println("普通表单项:"+item1.getName()+"="+item1.getString("utf-8"));  
  33.             System.out.println("文件表单项:");  
  34.             System.out.println("Content-Type"+item2.getContentType());  
  35.             System.out.println("filename="+item2.getName());  
  36.             System.out.println("size = "+item2.getSize());  
  37.             item2.write(new File("d:\\1.jpg"));  
  38.               
  39.         } catch (Exception e) {  
  40.             throw new RuntimeException() ;  
  41.         }  
  42.     }  
  43.   
  44.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  45.             throws ServletException, IOException {  
  46.   
  47.         doGet(request, response);  
  48.     }  
  49.   
  50. }  



下面是设置了缓存文件夹+文件打散

jsp页面跟上面差不多:

[html] view plain copy print?
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%@ taglib uri = "http://java.sun.com/jsp/jstl/core"  prefix = "c" %>  
  3.   
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  5. <html>  
  6.   <head>  
  7.      
  8.     <title>My JSP 'uploadfile.jsp' starting page</title>  
  9.       
  10.     <meta http-equiv="pragma" content="no-cache">  
  11.     <meta http-equiv="cache-control" content="no-cache">  
  12.     <meta http-equiv="expires" content="0">      
  13.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  14.     <meta http-equiv="description" content="This is my page">  
  15.     <!-- 
  16.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  17.     -->  
  18.   
  19.   </head>  
  20.     
  21.   <body>  
  22.   <h1>${msg }</h1>  
  23.      <form action="<c:url value = '/UploadServlet2' />" method="post" enctype="multipart/form-data" >  
  24.         用户名:<input type = "text" name = "username">  
  25.         上传照片:<input type = "file" name = "photo">  
  26.         <input type = "submit" value="提交">  
  27.     </form>  
  28.   </body>  
  29. </html>  




servlet的实现依赖commons.fileupload组件
[java] view plain copy print?
  1. package cn.Lionel.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.List;  
  6. import java.util.UUID;  
  7.   
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. import org.apache.commons.fileupload.FileItem;  
  14. import org.apache.commons.fileupload.FileUploadBase;  
  15. import org.apache.commons.fileupload.FileUploadException;  
  16. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  17. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  18.   
  19. public class UploadServlet3 extends HttpServlet {  
  20.   
  21.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  22.             throws ServletException, IOException {  
  23.   
  24.         response.setContentType("text/html");  
  25.   
  26.         //设置缓冲区和临时目录  
  27.         DiskFileItemFactory factory = new DiskFileItemFactory(100,new File("e:\\temp"));  
  28.   
  29.         ServletFileUpload upload = new ServletFileUpload(factory);  
  30.         //限制上传的文件大小  
  31.         //upload.setFileSizeMax(200*1024) ;  
  32.         //限制整个表单的大小:upload.setSizeMax();  
  33.           
  34.         try {  
  35.             List<FileItem> list = upload.parseRequest(request);  
  36.             FileItem item = list.get(1);  
  37.             String filename = item.getName();  
  38.             //处理有些浏览器返回的文件名是绝对路径  
  39.             int index = filename.lastIndexOf("\\") ;  
  40.             if(index != -1)  
  41.             {  
  42.                 filename = filename.substring(index+1);  
  43.             }  
  44.             int hashCode = filename.hashCode();  
  45.             //把hash值转换为十六进制  
  46.             String hex = Integer.toHexString(hashCode);  
  47.               
  48.             String realPath = this.getServletContext().getRealPath(  
  49.                     "WEB-INF/files");  
  50.   
  51.             File dirFile = new File(realPath + "/" + hex.charAt(0) + "/"  
  52.                     + hex.charAt(1));  
  53.             //创建目录链  
  54.             dirFile.mkdirs();  
  55.             String savename = uuid()+"_"+filename;  
  56.             File destFile = new File(dirFile,savename);  
  57.             item.write(destFile);  
  58.               
  59.         }catch (FileUploadException e) {  
  60.             if(e instanceof FileUploadBase.FileSizeLimitExceededException)  
  61.             {  
  62.                 request.setAttribute("msg""您上传的文件超出200KiB!") ;  
  63.                 request.getRequestDispatcher("/uploadfile2.jsp").forward(request, response) ;  
  64.                 return ;  
  65.             }  
  66.         }   
  67.           
  68.         catch (Exception e) {  
  69.             throw new RuntimeException();  
  70.         }  
  71.   
  72.     }  
  73.     private String uuid() {  
  74.         return UUID.randomUUID().toString().replace("-""").toUpperCase();  
  75.     }  
  76.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  77.             throws ServletException, IOException {  
  78.   
  79.         doGet(request, response);  
  80.     }  
  81.   
  82. }  



说完了上传,该说下载了:

该事先依赖commons.io组件,直接访问servlet实现下载。要下载的文件需要改你自己项目中存在的文件。

[java] view plain copy print?
  1. package cn.Lionel.servlet;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.net.URLEncoder;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.ServletOutputStream;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. import org.apache.commons.io.IOUtils;  
  14.   
  15. import sun.misc.BASE64Encoder;  
  16.   
  17. public class DownloadServlet extends HttpServlet {  
  18.   
  19.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  20.             throws ServletException, IOException {  
  21.   
  22.         response.setContentType("text/html;charset = utf-8");  
  23.   
  24.         String filename = "E:\\KuGou\\可米小子 - 青春纪念册.mp3"//改为自己项目中存在的文件  
  25.         //这种方法对部分字符仍存在乱码!  
  26.         //String dname = new String("青春纪念册.mp3".getBytes("utf-8"), "iso-8859-1");  
  27.         //这种方法最常用!解决文件名乱码  
  28.         String dname = filenameEncoding("青春纪念册.mp3",request);  
  29.           
  30.         String contentType = this.getServletContext().getMimeType(filename);  
  31.         String contentDisposition = "attachment;filename="+dname;  
  32.         response.setHeader("Content-Type", contentType + "");  
  33.         response.setHeader("Content-Disposition", contentDisposition);  
  34.   
  35.         FileInputStream input = new FileInputStream(filename);  
  36.         ServletOutputStream out = response.getOutputStream();  
  37.   
  38.         IOUtils.copy(input, out);  
  39.         input.close();  
  40.   
  41.     }  
  42.   
  43.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  44.             throws ServletException, IOException {  
  45.   
  46.         doGet(request, response);  
  47.     }  
  48.   
  49.   
  50.     public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {  
  51.         String agent = request.getHeader("User-Agent"); //获取浏览器  
  52.         if (agent.contains("Firefox")) {  
  53.             BASE64Encoder base64Encoder = new BASE64Encoder();  
  54.             filename = "=?utf-8?B?"  
  55.                     + base64Encoder.encode(filename.getBytes("utf-8"))  
  56.                     + "?=";  
  57.         } else if(agent.contains("MSIE")) {  
  58.             filename = URLEncoder.encode(filename, "utf-8");  
  59.         } else {  
  60.             filename = URLEncoder.encode(filename, "utf-8");  
  61.         }  
  62.         return filename;  
  63.     }  
  64. }  


能力有限。写博客只为了防止自己忘记,方便查找,如有错误,还望指出

原创粉丝点击