文件上传首先要引入两个核心包
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
下面是对文件上传和下载的一些代码做的一个简单封装,可以方便以后直接使用【使用时将封装好的jar包直接导入工程中即可使用】
上传文件核心代码
1 package com.lizhou.fileload; 2
3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.util.ArrayList; 9 import java.util.List; 10 import java.util.UUID; 11
12 import javax.servlet.http.HttpServletRequest; 13
14 import org.apache.commons.fileupload.FileItem; 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 import com.lizhou.exception.FileFormatException; 20 import com.lizhou.exception.NullFileException; 21 import com.lizhou.exception.ProtocolException; 22 import com.lizhou.exception.SizeException; 23
24 /**
25 * 上传文件 26 * @author bojiangzhou 27 * 28 */
29 public class FileUpload { 30 /**
31 * 上传文件用的临时目录 32 */
33 private String tempPath = null; 34 /**
35 * 上传文件用的文件目录 36 */
37 private String filePath = null; 38 /**
39 * 内存中缓存区的大小,默认100k 40 */
41 private int bufferSize = 100; 42 /**
43 * 上传文件的最大大小,默认1M 44 */
45 private int fileSize = 1000; 46 /**
47 * 上传文件使用的编码方式,默认UTF-8 48 */
49 private String encoding = "UTF-8"; 50 /**
51 * 上传文件的格式,默认无格式限制 52 */
53 private List<String> fileFormat = new ArrayList<String>(); 54 /**
55 * HttpServletRequest 56 */
57 private HttpServletRequest request; 58 //私有化无参构造
59 private FileUpload(){} 60
61 public FileUpload(HttpServletRequest request){ 62 this.request = request; 63 } 64
65 public FileUpload(String tempPath, String filePath, HttpServletRequest request){ 66 this.request = request; 67 this.tempPath = tempPath; 68 this.filePath = filePath; 69 makeDirectory(tempPath); 70 makeDirectory(filePath); 71 } 72
73 /**
74 * 上传文件 75 * @return 上传成功返回true 76 * @throws ProtocolException 77 * @throws FileUploadException 78 * @throws NullFileException 79 * @throws SizeException 80 * @throws FileFormatException 81 * @throws IOException 82 */
83 public boolean uploadFile() 84 throws ProtocolException, NullFileException, SizeException, FileFormatException, IOException, FileUploadException{ 85 boolean b = true; 86 ServletFileUpload upload = getUpload(); 87 //解析request中的字段,每个字段(上传字段和普通字段)都会自动包装到FileItem中
88 List<FileItem> fileItems = upload.parseRequest(this.request); 89 for(FileItem item : fileItems){ 90 //如果为普通字段
91 if(item.isFormField()){ 92 continue; 93 } 94 //获取文件名
95 String fileName = item.getName(); 96 //因为IE6得到的是文件的全路径,所以进一步处理
97 fileName = fileName.substring(fileName.lastIndexOf("\\")+1); 98 //判断上传的文件是否为空
99 if(item.getSize() <= 0){ 100 b = false; 101 throw new NullFileException(); 102 } 103 //判断文件是否超过限制的大小
104 if(item.getSize() > fileSize*1000){ 105 b = false; 106 throw new SizeException(); 107 } 108 //判断上传文件的格式是否正确
109 if( !isFormat(fileName.substring(fileName.lastIndexOf(".")+1)) ){ 110 b = false; 111 throw new FileFormatException(); 112 } 113 String uuidFileName = getUuidFileName(fileName); 114 //获取文件的输入流
115 InputStream is = item.getInputStream(); 116 //创建输出流
117 OutputStream os = new FileOutputStream(this.filePath+"/"+uuidFileName); 118 //输出
119 output(is, os); 120 //将上传文件时产生的临时文件删除
121 item.delete(); 122 } 123 return b; 124 } 125
126 /**
127 * 获取文件上传的输入流 128 * @return
129 * @throws ProtocolException 130 * @throws NullFileException 131 * @throws SizeException 132 * @throws FileFormatException 133 * @throws IOException 134 * @throws FileUploadException 135 */
136 public InputStream getUploadInputStream() 137 throws ProtocolException, NullFileException, SizeException, FileFormatException, IOException, FileUploadException{ 138 ServletFileUpload upload = getUpload(); 139 //解析request中的字段,每个字段(上传字段和普通字段)都会自动包装到FileItem中
140 List<FileItem> fileItems = upload.parseRequest(this.request); 141 for(FileItem item : fileItems){ 142 //如果为普通字段
143 if(item.isFormField()){ 144 continue; 145 } 146 //获取文件名
147 String fileName = item.getName(); 148 //因为IE6得到的是文件的全路径,所以进一步处理
149 fileName = fileName.substring(fileName.lastIndexOf("\\")+1); 150 //判断上传的文件是否为空
151 if(item.getSize() <= 0){ 152 throw new NullFileException(); 153 } 154 //判断文件是否超过限制的大小
155 if(item.getSize() > fileSize*1000){ 156 throw new SizeException(); 157 } 158 //判断上传文件的格式是否正确
159 if( !isFormat(fileName.substring(fileName.lastIndexOf(".")+1)) ){ 160 throw new FileFormatException(); 161 } 162 //获取文件的输入流
163 InputStream is = item.getInputStream(); 164
165 return is; 166 } 167 return null; 168 } 169
170 /**
171 * 获取上传文件的核心 172 * @return ServletFileUpload 173 * @throws ProtocolException 174 */
175 public ServletFileUpload getUpload() throws ProtocolException{ 176 //创建上传文件工厂
177 DiskFileItemFactory factory = new DiskFileItemFactory(); 178 //设置内存中缓存区的大小
179 factory.setSizeThreshold(bufferSize); 180 //如果用户未设置上传文件目录,则设置默认目录
181 if(filePath == null){ 182 setDefaultFilePath(); 183 } 184 //如果用户未设置临时存放目录,则设置默认目录
185 if(tempPath == null){ 186 setDefaultTempPath(); 187 } 188 //设置上传文件的的临时存放目录
189 factory.setRepository(new File(this.tempPath)); 190 //创建上传文件对象[核心]
191 ServletFileUpload upload = new ServletFileUpload(factory); 192 //设置上传文件的编码方式
193 upload.setHeaderEncoding(this.encoding); 194 /*
195 * 判断客户端上传文件是否使用MIME协议 196 * 只有当以MIME协议上传文件时,upload才能解析request中的字段 197 */
198 if(!upload.isMultipartContent(this.request)){ 199 throw new ProtocolException(); 200 } 201 return upload; 202 } 203
204 /**
205 * 输出 206 * @param is 207 * @param os 208 * @throws IOException 209 */
210 public void output(InputStream is, OutputStream os) throws IOException{ 211 byte[] by = new byte[1024]; 212 int len = 0; 213 while( (len = is.read(by)) > 0 ){ 214 os.write(by, 0, len); 215 } 216 is.close(); 217 os.close(); 218 } 219
220 /**
221 * 判断上传文件的格式是否正确 222 * @param format 文件格式 223 * @return boolean 224 */
225 private boolean isFormat(String format){ 226 if(fileFormat.size() == 0){ 227 return true; 228 } 229 for(String f : fileFormat){ 230 if(f.equalsIgnoreCase(format)){ 231 return true; 232 } 233 } 234 return false; 235 } 236
237 /**
238 * 返回文件的UUID名,防止文件名重复 239 * @param fileName 文件名 240 * @return uuid名 241 */
242 public String getUuidFileName(String fileName){ 243 return UUID.randomUUID().toString()+"#"+fileName; 244 } 245
246 /**
247 * 设置默认临时目录 248 */
249 private void setDefaultTempPath(){ 250 tempPath = filePath+"/temp"; 251
252 makeDirectory(tempPath); 253 } 254
255 /**
256 * 设置默认文件目录 257 * 默认在D盘 258 */
259 private void setDefaultFilePath(){ 260 filePath = "D:/uploadFile"; 261
262 makeDirectory(filePath); 263 } 264
265 /**
266 * 根据给定的文件目录创建目录 267 * @param filePath 268 */
269 private void makeDirectory(String filePath){ 270 File file = new File(filePath); 271 if(!file.exists()){ 272 file.mkdir(); 273 } 274 } 275
276
277
278 /**
279 * 获取临时目录 280 * @return
281 */
282 public String getTempPath() { 283 return tempPath; 284 } 285 /**
286 * 设置临时目录 287 * @param tempPath 288 */
289 public void setTempPath(String tempPath) { 290 this.tempPath = tempPath; 291 makeDirectory(tempPath); 292 } 293 /**
294 * 获取文件路径 295 * @return
296 */
297 public String getFilePath() { 298 return filePath; 299 } 300 /**
301 * 返回文件路径 302 * @param filePath 303 */
304 public void setFilePath(String filePath) { 305 this.filePath = filePath; 306 makeDirectory(filePath); 307 } 308 /**
309 * 获取内存中缓存区大小 310 * @return
311 */
312 public int getBufferSize() { 313 return bufferSize; 314 } 315 /**
316 * 设置内存中缓存区大小 317 * 默认100k 318 * @param bufferSize 319 */
320 public void setBufferSize(int bufferSize) { 321 this.bufferSize = bufferSize; 322 } 323 /**
324 * 获取上传文件的最大大小 325 * @return
326 */
327 public int getFileSize() { 328 return fileSize; 329 } 330 /**
331 * 限制上传文件的最大大小,单位为k 332 * 默认1000k 333 * @param fileSize 334 */
335 public void setFileSize(int fileSize) { 336 this.fileSize = fileSize; 337 } 338 /**
339 * 返回上传文件的编码方式 340 * @return
341 */
342 public String getEncoding() { 343 return encoding; 344 } 345 /**
346 * 设置上传文件的编码方式 347 * 默认UTF-8格式 348 * @param encoding 349 */
350 public void setEncoding(String encoding) { 351 this.encoding = encoding; 352 } 353 /**
354 * 获取允许上传文件的格式 355 * @return
356 */
357 public String getFileFormat() { 358 if(fileFormat.size() == 0){ 359 return "*"; 360 } 361 String format = ""; 362 for(String s:fileFormat){ 363 format += ","+s; 364 } 365 format = format.substring(format.indexOf(",")+1); 366 return format; 367 } 368 /**
369 * 设置上传文件的格式,多个文件格式则多次调用该方法进行设置 370 * @param fileFormat 371 */
372 public void setFileFormat(String format) { 373 this.fileFormat.add(format); 374 } 375
376 public HttpServletRequest getRequest() { 377 return request; 378 } 379
380 public void setRequest(HttpServletRequest request) { 381 this.request = request; 382 } 383
384 }
下载文件核心代码
1 package com.lizhou.fileload; 2
3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.OutputStream; 9 import java.io.UnsupportedEncodingException; 10 import java.net.URLEncoder; 11 import java.util.ArrayList; 12 import java.util.List; 13
14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16
17 import com.lizhou.domain.DownloadFile; 18 import com.lizhou.exception.FileNotExistsException; 19
20 /**
21 * 下载文件 22 * @author bojiangzhou 23 * 24 */
25 public class FileDownload { 26 /**
27 * 下载时的默认文件目录 28 */
29 private String filePath = null; 30 /**
31 * 要下载文件的格式 32 */
33 private List<String> fileFormat = new ArrayList<String>(); 34 /**
35 * HttpServletRequest 36 */
37 private HttpServletRequest request; 38
39 public FileDownload(HttpServletRequest request){ 40 this.request = request; 41 } 42
43 public FileDownload(String filePath, HttpServletRequest request){ 44 this.request = request; 45 this.filePath = filePath; 46 } 47
48 /**
49 * 将下载列表绑定到域中 50 * 默认session 51 * @param var 域对象变量名 52 * @throws FileNotExistsException 53 */
54 public void bindDownloadFilesToScope(String var) throws FileNotExistsException{ 55 if(filePath == null){ 56 filePath = "D:/uploadFile"; 57 } 58 if(!isFileExists(this.filePath)){ 59 throw new FileNotExistsException(); 60 } 61 List<DownloadFile> list = new ArrayList<DownloadFile>(); 62 getDownloadFiles(filePath, list); 63 request.getSession().setAttribute(var, list); 64 } 65
66 /**
67 * 获得下载目录下的所有文件 68 * @param filePath 69 * @param list 70 */
71 private void getDownloadFiles(String filePath, List<DownloadFile> list){ 72 File file = new File(filePath); 73 if(file.isFile()){ 74 String uuidFileName = file.getName(); 75 if(isFormat(uuidFileName.substring(uuidFileName.lastIndexOf(".")+1))){ 76 DownloadFile df = new DownloadFile(); 77 df.setFileName(uuidFileName.substring(uuidFileName.indexOf("#")+1)); 78 df.setUuidFileName(uuidFileName); 79 df.setFilePath(file.getPath()); 80 list.add(df); 81 } 82 } else{ 83 File[] childFiles = file.listFiles(); 84 for(File cf : childFiles){ 85 getDownloadFiles(cf.getPath(), list); 86 } 87 } 88 } 89
90 /**
91 * 下载文件 92 * @param var 下载列表的域变量名 93 * @param uuidFileName 客户端传来的文件的uuid名 94 * @param response 95 * @throws IOException 96 */
97 public void downloadFile(String var, String uuidFileName, HttpServletResponse response) throws IOException{ 98 byte[] by = uuidFileName.getBytes("ISO-8859-1"); 99 uuidFileName = new String(by, "UTF-8"); 100 List<DownloadFile> files = (List<DownloadFile>) this.request.getSession().getAttribute(var); 101 for(DownloadFile file : files){ 102 if(file.getUuidFileName().equals(uuidFileName)){ 103 InputStream is = new FileInputStream(file.getFilePath()); 104 OutputStream os = response.getOutputStream(); 105 response.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(file.getFileName(), "UTF-8")); 106 output(is, os); 107 break; 108 } 109 } 110 } 111
112 public void output(InputStream is, OutputStream os) throws IOException{ 113 byte[] by = new byte[1024]; 114 int len = 0; 115 while( (len = is.read(by)) > 0 ){ 116 os.write(by, 0, len); 117 } 118 is.close(); 119 os.close(); 120 } 121
122 /**
123 * 判断文件的格式是否正确 124 * @param format 文件格式 125 * @return boolean 126 */
127 private boolean isFormat(String format){ 128 if(fileFormat.size() == 0){ 129 return true; 130 } 131 for(String f : fileFormat){ 132 if(f.equalsIgnoreCase(format)){ 133 return true; 134 } 135 } 136 return false; 137 } 138
139 /**
140 * 判断文件目录是否存在 141 * @param filePath 文件目录 142 * @return boolean 143 */
144 private boolean isFileExists(String filePath){ 145 boolean b = true; 146 File file = new File(filePath); 147 if(!file.exists()){ 148 b = false; 149 } 150 return b; 151 } 152
153 public String getFilePath() { 154 return filePath; 155 } 156
157 /**
158 * 设置下载路径 159 * @param filePath 160 * @throws FileNotExistsException 161 */
162 public void setFilePath(String filePath) { 163 this.filePath = filePath; 164 } 165
166 /**
167 * 获取允许上传文件的格式 168 * @return
169 */
170 public String getFileFormat() { 171 if(fileFormat.size() == 0){ 172 return "*"; 173 } 174 String format = ""; 175 for(String s:fileFormat){ 176 format += ","+s; 177 } 178 format = format.substring(format.indexOf(",")+1); 179 return format; 180 } 181 /**
182 * 设置上传文件的格式,多个文件格式则多次调用该方法进行设置 183 * @param fileFormat 184 */
185 public void setFileFormat(String format) { 186 this.fileFormat.add(format); 187 } 188
189 public HttpServletRequest getRequest() { 190 return request; 191 } 192
193 public void setRequest(HttpServletRequest request) { 194 this.request = request; 195 } 196
197 }
注:上传文件时,前台form表单一定要有如下属性:enctype="multipart/form-data"
附上源码+导出的jar包+使用demo:下载文件