文件的上传
第一步:引入jar包
第二步:文件上传页面和消息提示页面
upload.jsp页面显示
<%@ page language="java" pageEncoding="UTF-8"%>
2 <!DOCTYPE HTML>
3 <html>
4 <head>
5 <title>文件上传</title>
6 </head>
7
8 <body>
9 <form action="${pageContext.request.contextPath}/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post">
10 上传用户:<input type="text" name="username"><br/>
11 上传文件1:<input type="file" name="file1"><br/>
12 上传文件2:<input type="file" name="file2"><br/>
13 <input type="submit" value="提交">
14 </form>
15 </body>
16 </html>
message.jsp页面
1 <%@ page language="java" pageEncoding="UTF-8"%>
2 <!DOCTYPE HTML>
3 <html>
4 <head>
5 <title>消息提示</title>
6 </head>
7
8 <body>
9 ${message}
10 </body>
11 </html>
处理文件的servlet
UploadHandleServlet的代码如下:
1 package me.gacl.web.controller;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.util.List;
8 import javax.servlet.ServletException;
9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
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 UploadHandleServlet extends HttpServlet {
17
18 public void doGet(HttpServletRequest request, HttpServletResponse response)
19 throws ServletException, IOException {
20 //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
21 String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
22 File file = new File(savePath);
23 //判断上传文件的保存目录是否存在
24 if (!file.exists() && !file.isDirectory()) {
25 System.out.println(savePath+"目录不存在,需要创建");
26 //创建目录
27 file.mkdir();
28 }
29 //消息提示
30 String message = "";
31 try{
32 //使用Apache文件上传组件处理文件上传步骤:
33 //1、创建一个DiskFileItemFactory工厂
34 DiskFileItemFactory factory = new DiskFileItemFactory();
35 //2、创建一个文件上传解析器
36 ServletFileUpload upload = new ServletFileUpload(factory);
37 //解决上传文件名的中文乱码
38 upload.setHeaderEncoding("UTF-8");
39 //3、判断提交上来的数据是否是上传表单的数据
40 if(!ServletFileUpload.isMultipartContent(request)){
41 //按照传统方式获取数据
42 return;
43 }
44 //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
45 List<FileItem> list = upload.parseRequest(request);
46 for(FileItem item : list){
47 //如果fileitem中封装的是普通输入项的数据
48 if(item.isFormField()){
49 String name = item.getFieldName();
50 //解决普通输入项的数据的中文乱码问题
51 String value = item.getString("UTF-8");
52 //value = new String(value.getBytes("iso8859-1"),"UTF-8");
53 System.out.println(name + "=" + value);
54 }else{//如果fileitem中封装的是上传文件
55 //得到上传的文件名称,
56 String filename = item.getName();
57 System.out.println(filename);
58 if(filename==null || filename.trim().equals("")){
59 continue;
60 }
61 //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
62 //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
63 filename = filename.substring(filename.lastIndexOf("\\")+1);
64 //获取item中的上传文件的输入流
65 InputStream in = item.getInputStream();
66 //创建一个文件输出流
67 FileOutputStream out = new FileOutputStream(savePath + "\\" + filename);
68 //创建一个缓冲区
69 byte buffer[] = new byte[1024];
70 //判断输入流中的数据是否已经读完的标识
71 int len = 0;
72 //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
73 while((len=in.read(buffer))>0){
74 //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
75 out.write(buffer, 0, len);
76 }
77 //关闭输入流
78 in.close();
79 //关闭输出流
80 out.close();
81 //删除处理文件上传时生成的临时文件
82 item.delete();
83 message = "文件上传成功!";
84 }
85 }
86 }catch (Exception e) {
87 message= "文件上传失败!";
88 e.printStackTrace();
89
90 }
91 request.setAttribute("message",message);
92 request.getRequestDispatcher("/message.jsp").forward(request, response);
93 }
94
95 public void doPost(HttpServletRequest request, HttpServletResponse response)
96 throws ServletException, IOException {
97
98 doGet(request, response);
99 }
100 }
在web.xml中配置
1 <servlet> 2 <servlet-name>UploadHandleServlet</servlet-name> 3 <servlet-class>me.gacl.web.controller.UploadHandleServlet</servlet-class> 4 </servlet> 5 6 <servlet-mapping> 7 <servlet-name>UploadHandleServlet</servlet-name> 8 <url-pattern>/servlet/UploadHandleServlet</url-pattern> 9 </servlet-mapping>
注意点:
1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。
2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。
3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。
4、要限制上传文件的最大值。
5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。