实现文件的上传和下载首先需要理解几个知识,这样才可以很好的完成文件的上传和下载;
(1):上传文件是上传到 服务器 上,而保存到 数据库 是文件名 (2):上传文件是以文件转换为二进制流的形式上传的 (3): enctype="multipart/form-data"需要设置在form里面,否则无法提交文件 (4):必须在servlet3.0里面加上这句话,@MultipartConfig
1:首先创建一个前台页面upload.jsp,源码如下所示:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>文件上传页面</title> 8 </head> 9 <body> 10 <script type="text/javascript"> 11 alert("${info}"); 12 </script> 14 <!-- 上传文件是上传到服务器上,而保存到数据库是文件名 --> 15 <!-- 上传文件是以文件转换为二进制流的形式上传的 --> 16 <!-- enctype="multipart/form-data"需要设置在form里面,否则无法提交文件 --> 17 <form action="upload" method="post" enctype="multipart/form-data"> 18 <table> 19 <tr> 20 <td></td> 21 <td><h1>文件上传</h1></td> 22 </tr> 23 <tr> 24 <td>文件描述:</td> 25 <td><input type="text" name="desc"/></td> 26 </tr> 27 <tr> 28 <td>上传文件:</td> 29 <td><input type="file" name="file"/></td> 30 </tr> 31 <tr> 32 <td></td> 33 <td><input type="submit" value="上传文件"/></td> 34 </tr> 35 </table> 36 </form> 37 </body> 38 </html>
2:在webcontent目录下面创建一个文件夹upload用于存放上传到服务器的文件;
3:创建后台处理页面servlet,文件名如UploadServlet.java,源码如下所示;
1 package com.bie; 3 import java.io.IOException; 4 import java.util.UUID; 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.MultipartConfig; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 import javax.servlet.http.Part; 14 /** 15 * @author BieHongLi 16 * @version 创建时间:2017年3月4日 下午5:29:03 17 * 注意:上传文件必须添加@MultipartConfig()可以设置上传文件的大小 18 */ 19 @WebServlet("/upload") 20 @MultipartConfig 21 public class UploadServlet extends HttpServlet{ 24 private static final long serialVersionUID = 1L; 26 @Override 27 protected void doPost(HttpServletRequest request, HttpServletResponse response) 28 throws ServletException, IOException { 29 try { 30 //获取文件描述信息 31 String desc=request.getParameter("desc"); 32 //获取上传的文件 33 Part part=request.getPart("file"); 34 //获取请求的信息 35 String name=part.getHeader("content-disposition"); 36 //System.out.println(name);//测试使用 37 //System.out.println(desc);// 39 //获取上传文件的目录 40 String root=request.getServletContext().getRealPath("/upload"); 41 System.out.println("测试上传文件的路径:"+root); 43 //获取文件的后缀 44 String str=name.substring(name.lastIndexOf("."), name.length()-1); 45 System.out.println("测试获取文件的后缀:"+str); 47 //生成一个新的文件名,不重复,数据库存储的就是这个文件名,不重复的 48 String filename=root+"\\"+UUID.randomUUID().toString()+str; 49 System.out.println("测试产生新的文件名:"+filename); 51 //上传文件到指定目录,不想上传文件就不调用这个 52 part.write(filename); 54 request.setAttribute("info", "上传文件成功"); 55 } catch (Exception e) { 56 e.printStackTrace(); 57 request.setAttribute("info", "上传文件失败"); 58 } 60 request.getRequestDispatcher("/upload.jsp").forward(request, response); 61 } 63 }
演示效果如下所示:注意上传文件所在的目录,如下图所示;
1:下载是在上传的基础上增加了一些内容,源码如下所示:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>文件上传页面</title> 9 </head> 10 <body> 11 <script type="text/javascript"> 12 alert("${info}"); 13 </script> 15 <!-- 上传文件是上传到服务器上,而保存到数据库是文件名 --> 16 <!-- 上传文件是以文件转换为二进制流的形式上传的 --> 17 <!-- enctype="multipart/form-data"需要设置在form里面,否则无法提交文件 --> 18 <form action="upload" method="post" enctype="multipart/form-data"> 19 <table> 20 <tr> 21 <td></td> 22 <td><h1>文件上传</h1></td> 23 </tr> 24 <tr> 25 <td>文件描述:</td> 26 <td><input type="text" name="desc"/></td> 27 </tr> 28 <tr> 29 <td>上传文件:</td> 30 <td><input type="file" name="file"/></td> 31 </tr> 32 <tr> 33 <td></td> 34 <td><input type="submit" value="上传文件"/></td> 35 </tr> 36 </table> 37 </form> 39 <div> 40 <h2>下载文件</h2> 41 <c:forEach items="${files }" var="name"> 42 <a href="upload/${name }">${name }</a><br/> 43 </c:forEach> 44 </div> 45 </body> 46 </html>
1 package com.bie; 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.List; 6 import java.util.UUID; 8 import javax.servlet.ServletException; 9 import javax.servlet.annotation.MultipartConfig; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 import javax.servlet.http.HttpSession; 15 import javax.servlet.http.Part; 17 /** 18 * @author BieHongLi 19 * @version 创建时间:2017年3月4日 下午5:29:03 20 * 注意:上传文件必须添加@MultipartConfig()可以设置上传文件的大小 21 */ 22 @WebServlet("/upload") 23 @MultipartConfig 24 public class UploadServlet extends HttpServlet{ 27 private static final long serialVersionUID = 1L; 29 @Override 30 protected void doPost(HttpServletRequest request, HttpServletResponse response) 31 throws ServletException, IOException { 32 //模拟数据库存储文件名 33 HttpSession session=request.getSession(); 34 List<String> list=(List<String>)session.getAttribute("files"); 35 if(list==null){ 36 //如果集合为空,就创建一个集合 37 list=new ArrayList<String>(); 38 } 40 try { 41 //获取文件描述信息 42 String desc=request.getParameter("desc"); 43 //获取上传的文件 44 Part part=request.getPart("file"); 45 //获取请求的信息 46 String name=part.getHeader("content-disposition"); 47 //System.out.println(name);//测试使用 48 //System.out.println(desc);// 50 //获取上传文件的目录 51 String root=request.getServletContext().getRealPath("/upload"); 52 System.out.println("测试上传文件的路径:"+root); 54 //获取文件的后缀 55 String str=name.substring(name.lastIndexOf("."), name.length()-1); 56 System.out.println("测试获取文件的后缀:"+str); 58 //生成一个新的文件名,不重复,数据库存储的就是这个文件名,不重复的 59 String fname=UUID.randomUUID().toString()+str; 60 //将文件名保存到集合中 61 list.add(fname); 62 //将保存在集合中的文件名保存到域中 63 session.setAttribute("files", list); 65 String filename=root+"\\"+fname; 66 System.out.println("测试产生新的文件名:"+filename); 68 //上传文件到指定目录,不想上传文件就不调用这个 69 part.write(filename); 71 request.setAttribute("info", "上传文件成功"); 72 } catch (Exception e) { 73 e.printStackTrace(); 74 request.setAttribute("info", "上传文件失败");