实现文件的上传和下载首先需要理解几个知识,这样才可以很好的完成文件的上传和下载;
(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>
13
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;
2
3 import java.io.IOException;
4 import java.util.UUID;
5
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;
13
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{
22
23
24 private static final long serialVersionUID = 1L;
25
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);//
38
39 //获取上传文件的目录
40 String root=request.getServletContext().getRealPath("/upload");
41 System.out.println("测试上传文件的路径:"+root);
42
43 //获取文件的后缀
44 String str=name.substring(name.lastIndexOf("."), name.length()-1);
45 System.out.println("测试获取文件的后缀:"+str);
46
47 //生成一个新的文件名,不重复,数据库存储的就是这个文件名,不重复的
48 String filename=root+"\\"+UUID.randomUUID().toString()+str;
49 System.out.println("测试产生新的文件名:"+filename);
50
51 //上传文件到指定目录,不想上传文件就不调用这个
52 part.write(filename);
53
54 request.setAttribute("info", "上传文件成功");
55 } catch (Exception e) {
56 e.printStackTrace();
57 request.setAttribute("info", "上传文件失败");
58 }
59
60 request.getRequestDispatcher("/upload.jsp").forward(request, response);
61 }
62
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>
14
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>
38
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;
2
3 import java.io.IOException;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.UUID;
7
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;
16
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{
25
26
27 private static final long serialVersionUID = 1L;
28
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 }
39
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);//
49
50 //获取上传文件的目录
51 String root=request.getServletContext().getRealPath("/upload");
52 System.out.println("测试上传文件的路径:"+root);
53
54 //获取文件的后缀
55 String str=name.substring(name.lastIndexOf("."), name.length()-1);
56 System.out.println("测试获取文件的后缀:"+str);
57
58 //生成一个新的文件名,不重复,数据库存储的就是这个文件名,不重复的
59 String fname=UUID.randomUUID().toString()+str;
60 //将文件名保存到集合中
61 list.add(fname);
62 //将保存在集合中的文件名保存到域中
63 session.setAttribute("files", list);
64
65 String filename=root+"\\"+fname;
66 System.out.println("测试产生新的文件名:"+filename);
67
68 //上传文件到指定目录,不想上传文件就不调用这个
69 part.write(filename);
70
71 request.setAttribute("info", "上传文件成功");
72 } catch (Exception e) {
73 e.printStackTrace();
74 request.setAttribute("info", "上传文件失败");
75 }
76
77 request.getRequestDispatcher("/upload.jsp").forward(request, response);
78 }
79
80 }
革命尚未成功,别先生仍需努力啊!!!