1 package pageckage;
2
3
4
5 import java.io.File;
6 import java.io.*;
7 import java.io.IOException;
8 import java.io.PrintWriter;
9 import java.util.List;
10
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15
16 import org.apache.commons.fileupload.FileItem;
17 import org.apache.commons.fileupload.FileUploadException;
18 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
19 import org.apache.commons.fileupload.servlet.ServletFileUpload;
20
21 /**
22 *
23 * @author Administrator
24 * 文件上传
25 * 具体步骤:
26 * 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包
27 * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同
28 * 3)对 DiskFileItemFactory 对象设置一些 属性
29 * 4)高水平的API文件上传处理 ServletFileUpload upload = new ServletFileUpload(factory);
30 * 目的是调用 parseRequest(request)方法 获得 FileItem 集合list ,
31 *
32 * 5)在 FileItem 对象中 获取信息, 遍历, 判断 表单提交过来的信息 是否是 普通文本信息 另做处理
33 * 6)
34 * 第一种. 用第三方 提供的 item.write( new File(path,filename) ); 直接写到磁盘上
35 * 第二种. 手动处理
36 *
37 */
38
39
40 /**
41 * jsp 页面代码
42 <!-- enctype 默认是 application/x-www-form-urlencoded -->
43 <form action="FileUpLoad" enctype="multipart/form-data" method="post" >
44
45 用户名:<input type="text" name="usename"> <br/>
46 上传文件:<input type="file" name="file1"><br/>
47 上传文件: <input type="file" name="file2"><br/>
48 <input type="submit" value="提交"/>
49
50 </form>
51
52 */
53
54
55
56 public class UploadServlet extends HttpServlet {
57
58 public void doPost(HttpServletRequest request, HttpServletResponse response)
59 throws ServletException, IOException {
60
61 request.setCharacterEncoding("utf-8"); //设置编码
62
63 //获得磁盘文件条目工厂
64 DiskFileItemFactory factory = new DiskFileItemFactory();
65 //获取文件需要上传到的路径
66 String path = request.getRealPath("/upload");
67
68 //如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
69 //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
70 /**
71 * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,
72 * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的
73 * 然后再将其真正写到 对应目录的硬盘上
74 */
75 factory.setRepository(new File(path));
76 //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
77 factory.setSizeThreshold(1024*1024) ;
78
79 //高水平的API文件上传处理
80 ServletFileUpload upload = new ServletFileUpload(factory);
81
82
83 try {
84 //可以上传多个文件
85 List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
86
87 for(FileItem item : list)
88 {
89 //获取表单的属性名字
90 String name = item.getFieldName();
91
92 //如果获取的 表单信息是普通的 文本 信息
93 if(item.isFormField())
94 {
95 //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
96 String value = item.getString() ;
97
98 request.setAttribute(name, value);
99 }
100 //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
101 else
102 {
103 /**
104 * 以下三步,主要获取 上传文件的名字
105 */
106 //获取路径名
107 String value = item.getName() ;
108 //索引到最后一个反斜杠
109 int start = value.lastIndexOf("\\");
110 //截取 上传文件的 字符串名字,加1是 去掉反斜杠,
111 String filename = value.substring(start+1);
112
113 request.setAttribute(name, filename);
114
115 //真正写到磁盘上
116 //它抛出的异常 用exception 捕捉
117
118 //item.write( new File(path,filename) );//第三方提供的
119
120 //手动写的
121 OutputStream out = new FileOutputStream(new File(path,filename));
122
123 InputStream in = item.getInputStream() ;
124
125 int length = 0 ;
126 byte [] buf = new byte[1024] ;
127
128 System.out.println("获取上传文件的总共的容量:"+item.getSize());
129
130 // in.read(buf) 每次读到的数据存放在 buf 数组中
131 while( (length = in.read(buf) ) != -1)
132 {
133 //在 buf 数组中 取出数据 写到 (输出流)磁盘上
134 out.write(buf, 0, length);
135
136 }
137
138 in.close();
139 out.close();
140 }
141 }
142
143
144
145 } catch (FileUploadException e) {
146 // TODO Auto-generated catch block
147 e.printStackTrace();
148 }
149 catch (Exception e) {
150 // TODO Auto-generated catch block
151
152 //e.printStackTrace();
153 }
154
155
156 request.getRequestDispatcher("filedemo.jsp").forward(request, response);
157
158
159 }
160
161 }