当提交表单里包含文件上传的时候,即Form的enctype属性值为multipart/form-data时,后台是无法像普通表单那样通过request.getParameter来获取用户提交的数据的。
这时候,当然可以通过解析提交到服务器的数据流来得到数据了,但是这样不但麻烦而且容易出错。
最好的方式是使用第三方的jar包获取数据,这方面有很多现成的成熟优秀的jar包。最常用的时以下三个:
apache的commons-fileupload : http://commons.apache.org/fileupload/
O'Reilly的cos: http://www.servlets.com/cos/index.html
jspsmart的SmartUpload:官方不提供下载了,google搜吧。
其中,据评测效率最高的是COS,最慢的是SmartUpload;最常用的是common-upload;文件太大时SmartUpland会崩溃。
1. common-upload示例代码:
view plaincopy to clipboardprint?
01.// 判断enctype属性是否为multipart/form-data
02.boolean isMultipart = ServletFileUpload.isMultipartContent(request);
03.
04.// Create a factory for disk-based file items
05.DiskFileItemFactory factory = new DiskFileItemFactory();
06.
07.// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
08.// 此方法是设置是否使用临时文件的临界值(单位:字节)
09.factory.setSizeThreshold(yourMaxMemorySize);
10.
11.// 与上一个结合使用,设置临时文件的路径(绝对路径)
12.factory.setRepository(yourTempDirectory);
13.
14.// Create a new file upload handler
15.ServletFileUpload upload = new ServletFileUpload(factory);
16.
17.// 设置上传内容的大小限制(单位:字节)
18.upload.setSizeMax(yourMaxRequestSize);
19.
20.// Parse the request
21.List<?> items = upload.parseRequest(request);
22.
23.Iterator iter = items.iterator();
24.while (iter.hasNext()) {
25. FileItem item = (FileItem) iter.next();
26.
27. if (item.isFormField()) {
28. //如果是普通表单字段
29. String name = item.getFieldName();
30. String value = item.getString();
31. ...
32. } else {
33. //如果是文件字段
34. String fieldName = item.getFieldName();
35. String fileName = item.getName();
36. String contentType = item.getContentType();
37. boolean isInMemory = item.isInMemory();
38. long sizeInBytes = item.getSize();
39. ...
40.
41. // Process a file upload
42. if (writeToFile) {
43. File uploadedFile = new File(...);
44. item.write(uploadedFile);
45. } else {
46. InputStream uploadedStream = item.getInputStream();
47. ...
48. uploadedStream.close();
49. }
50. }
51.}
[java] view plaincopyprint?
01.// 判断enctype属性是否为multipart/form-data
02.boolean isMultipart = ServletFileUpload.isMultipartContent(request);
03.
04.// Create a factory for disk-based file items
05.DiskFileItemFactory factory = new DiskFileItemFactory();
06.
07.// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
08.// 此方法是设置是否使用临时文件的临界值(单位:字节)
09.factory.setSizeThreshold(yourMaxMemorySize);
10.
11.// 与上一个结合使用,设置临时文件的路径(绝对路径)
12.factory.setRepository(yourTempDirectory);
13.
14.// Create a new file upload handler
15.ServletFileUpload upload = new ServletFileUpload(factory);
16.
17.// 设置上传内容的大小限制(单位:字节)
18.upload.setSizeMax(yourMaxRequestSize);
19.
20.// Parse the request
21.List<?> items = upload.parseRequest(request);
22.
23.Iterator iter = items.iterator();
24.while (iter.hasNext()) {
25. FileItem item = (FileItem) iter.next();
26.
27. if (item.isFormField()) {
28. //如果是普通表单字段
29. String name = item.getFieldName();
30. String value = item.getString();
31. ...
32. } else {
33. //如果是文件字段
34. String fieldName = item.getFieldName();
35. String fileName = item.getName();
36. String contentType = item.getContentType();
37. boolean isInMemory = item.isInMemory();
38. long sizeInBytes = item.getSize();
39. ...
40.
41. // Process a file upload
42. if (writeToFile) {
43. File uploadedFile = new File(...);
44. item.write(uploadedFile);
45. } else {
46. InputStream uploadedStream = item.getInputStream();
47. ...
48. uploadedStream.close();
49. }
50. }
51.}
// 判断enctype属性是否为multipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
// 此方法是设置是否使用临时文件的临界值(单位:字节)
factory.setSizeThreshold(yourMaxMemorySize);
// 与上一个结合使用,设置临时文件的路径(绝对路径)
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传内容的大小限制(单位:字节)
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List<?> items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
//如果是普通表单字段
String name = item.getFieldName();
String value = item.getString();
...
} else {
//如果是文件字段
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
...
// Process a file upload
if (writeToFile) {
File uploadedFile = new File(...);
item.write(uploadedFile);
} else {
InputStream uploadedStream = item.getInputStream();
...
uploadedStream.close();
}
}
}
2. cos示例代码:
view plaincopy to clipboardprint?
01.// 设置大小限制(单位:字节)
02.final int permitedSize = 314572800;
03.
04.try {
05. String type = "";
06. String name = "";
07. String originalFilename = "";
08. String extension1 = "";
09. String extension2 = "";
10. String filename = "";
11.
12. //上传目录
13. String strDirectory = "files";
14. String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");
15.
16. // 获取句柄
17. MultipartRequest multipartRequest = new MultipartRequest(request, uploadPath,
18. permitedSize, "ISO-8859-1", new DefaultFileRenamePolicy());
19.
20. // 取得文件
21. Enumeration files = multipartRequest.getFileNames();
22.
23. // 取得文件详细信息
24. while (files.hasMoreElements()) {
25. name = (String)files.nextElement();
26. type = multipartRequest.getContentType(name);
27. filename = multipartRequest.getFilesystemName(name);
28. originalFilename = multipartRequest.getOriginalFileName(name);
29. File currentFile = multipartRequest.getFile(name);
30. ...
31. }
32.
33. // 取得其它非文件字段
34. Enumeration params = multipartRequest.getParameterNames();
35.
36. while (params.hasMoreElements()) {
37. String name = (String)params.nextElement();
38. String value = multi.getParameter(name);
39. ...
40. }
41.} catch (Exception exception) {
42. response.sendError(response.SC_METHOD_NOT_ALLOWED);
43.} finally {
44. if (out != null) {out.close();}
45.}
[java] view plaincopyprint?
01.// 设置大小限制(单位:字节)
02.final int permitedSize = 314572800;
03.
04.try {
05. String type = "";
06. String name = "";
07. String originalFilename = "";
08. String extension1 = "";
09. String extension2 = "";
10. String filename = "";
11.
12. //上传目录
13. String strDirectory = "files";
14. String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");
15.
16. // 获取句柄
17. MultipartRequest multipartRequest = new MultipartRequest(request, uploadPath,
18. permitedSize, "ISO-8859-1", new DefaultFileRenamePolicy());
19.
20. // 取得文件
21. Enumeration files = multipartRequest.getFileNames();
22.
23. // 取得文件详细信息
24. while (files.hasMoreElements()) {
25. name = (String)files.nextElement();
26. type = multipartRequest.getContentType(name);
27. filename = multipartRequest.getFilesystemName(name);
28. originalFilename = multipartRequest.getOriginalFileName(name);
29. File currentFile = multipartRequest.getFile(name);
30. ...
31. }
32.
33. // 取得其它非文件字段
34. Enumeration params = multipartRequest.getParameterNames();
35.
36. while (params.hasMoreElements()) {
37. String name = (String)params.nextElement();
38. String value = multi.getParameter(name);
39. ...
40. }
41.} catch (Exception exception) {
42. response.sendError(response.SC_METHOD_NOT_ALLOWED);
43.} finally {
44. if (out != null) {out.close();}
45.}
// 设置大小限制(单位:字节)
final int permitedSize = 314572800;
try {
String type = "";
String name = "";
String originalFilename = "";
String extension1 = "";
String extension2 = "";
String filename = "";
//上传目录
String strDirectory = "files";
String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");
// 获取句柄
MultipartRequest multipartRequest = new MultipartRequest(request, uploadPath,
permitedSize, "ISO-8859-1", new DefaultFileRenamePolicy());
// 取得文件
Enumeration files = multipartRequest.getFileNames();
// 取得文件详细信息
while (files.hasMoreElements()) {
name = (String)files.nextElement();
type = multipartRequest.getContentType(name);
filename = multipartRequest.getFilesystemName(name);
originalFilename = multipartRequest.getOriginalFileName(name);
File currentFile = multipartRequest.getFile(name);
...
}
// 取得其它非文件字段
Enumeration params = multipartRequest.getParameterNames();
while (params.hasMoreElements()) {
String name = (String)params.nextElement();
String value = multi.getParameter(name);
...
}
} catch (Exception exception) {
response.sendError(response.SC_METHOD_NOT_ALLOWED);
} finally {
if (out != null) {out.close();}
}
3. SmartUpload示例代码:
view plaincopy to clipboardprint?
01.smartupload mysmartupload = new smartupload();
02.mysmartupload.initialize(this.getServletConfig(), request, response);
03.// 设置文件大小限制(单位:字节)
04.mysmartupload.setMaxFileSize(10000000);
05.// 设置总上传数据总大小(单位:字节)
06.mysmartupload.setTotalMaxFileSize(20000000);
07.// 设置允许的文件扩展名
08.mysmartupload.setAllowedFilesList("jpg,png,gif,bmp,jpeg");
09.// 设置不允许的文件扩展名
10.mysmartupload.setDeniedFilesList("exe,bat,jsp,htm,html,,");
11.
12.try {
13. mysmartupload.upload();
14.} catch (smartuploadException e1) {
15. e1.printStackTrace();
16.}
17.
18.// 读取其它非文件上传字段
19.com.jspsmart.upload.Request req = mysmartupload.getRequest();
20.String title = req.getParameter("dest");
21.
22.// 保存文件
23.for (int i = 0; i < mysmartupload.getFiles().getCount(); i++) {
24. com.jspsmart.upload.File file = mysmartupload.getFiles().getFile(i);
25.
26. if (file.isMissing()) continue;
27.
28. try {
29. file.saveAs("yourSavePath" + file.getFileName());
30. } catch (smartuploadException e) {
31. e.printStackTrace();
32. }
33.}
这时候,当然可以通过解析提交到服务器的数据流来得到数据了,但是这样不但麻烦而且容易出错。
最好的方式是使用第三方的jar包获取数据,这方面有很多现成的成熟优秀的jar包。最常用的时以下三个:
apache的commons-fileupload : http://commons.apache.org/fileupload/
O'Reilly的cos: http://www.servlets.com/cos/index.html
jspsmart的SmartUpload:官方不提供下载了,google搜吧。
其中,据评测效率最高的是COS,最慢的是SmartUpload;最常用的是common-upload;文件太大时SmartUpland会崩溃。
1. common-upload示例代码:
view plaincopy to clipboardprint?
01.// 判断enctype属性是否为multipart/form-data
02.boolean isMultipart = ServletFileUpload.isMultipartContent(request);
03.
04.// Create a factory for disk-based file items
05.DiskFileItemFactory factory = new DiskFileItemFactory();
06.
07.// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
08.// 此方法是设置是否使用临时文件的临界值(单位:字节)
09.factory.setSizeThreshold(yourMaxMemorySize);
10.
11.// 与上一个结合使用,设置临时文件的路径(绝对路径)
12.factory.setRepository(yourTempDirectory);
13.
14.// Create a new file upload handler
15.ServletFileUpload upload = new ServletFileUpload(factory);
16.
17.// 设置上传内容的大小限制(单位:字节)
18.upload.setSizeMax(yourMaxRequestSize);
19.
20.// Parse the request
21.List<?> items = upload.parseRequest(request);
22.
23.Iterator iter = items.iterator();
24.while (iter.hasNext()) {
25. FileItem item = (FileItem) iter.next();
26.
27. if (item.isFormField()) {
28. //如果是普通表单字段
29. String name = item.getFieldName();
30. String value = item.getString();
31. ...
32. } else {
33. //如果是文件字段
34. String fieldName = item.getFieldName();
35. String fileName = item.getName();
36. String contentType = item.getContentType();
37. boolean isInMemory = item.isInMemory();
38. long sizeInBytes = item.getSize();
39. ...
40.
41. // Process a file upload
42. if (writeToFile) {
43. File uploadedFile = new File(...);
44. item.write(uploadedFile);
45. } else {
46. InputStream uploadedStream = item.getInputStream();
47. ...
48. uploadedStream.close();
49. }
50. }
51.}
[java] view plaincopyprint?
01.// 判断enctype属性是否为multipart/form-data
02.boolean isMultipart = ServletFileUpload.isMultipartContent(request);
03.
04.// Create a factory for disk-based file items
05.DiskFileItemFactory factory = new DiskFileItemFactory();
06.
07.// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
08.// 此方法是设置是否使用临时文件的临界值(单位:字节)
09.factory.setSizeThreshold(yourMaxMemorySize);
10.
11.// 与上一个结合使用,设置临时文件的路径(绝对路径)
12.factory.setRepository(yourTempDirectory);
13.
14.// Create a new file upload handler
15.ServletFileUpload upload = new ServletFileUpload(factory);
16.
17.// 设置上传内容的大小限制(单位:字节)
18.upload.setSizeMax(yourMaxRequestSize);
19.
20.// Parse the request
21.List<?> items = upload.parseRequest(request);
22.
23.Iterator iter = items.iterator();
24.while (iter.hasNext()) {
25. FileItem item = (FileItem) iter.next();
26.
27. if (item.isFormField()) {
28. //如果是普通表单字段
29. String name = item.getFieldName();
30. String value = item.getString();
31. ...
32. } else {
33. //如果是文件字段
34. String fieldName = item.getFieldName();
35. String fileName = item.getName();
36. String contentType = item.getContentType();
37. boolean isInMemory = item.isInMemory();
38. long sizeInBytes = item.getSize();
39. ...
40.
41. // Process a file upload
42. if (writeToFile) {
43. File uploadedFile = new File(...);
44. item.write(uploadedFile);
45. } else {
46. InputStream uploadedStream = item.getInputStream();
47. ...
48. uploadedStream.close();
49. }
50. }
51.}
// 判断enctype属性是否为multipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存
// 此方法是设置是否使用临时文件的临界值(单位:字节)
factory.setSizeThreshold(yourMaxMemorySize);
// 与上一个结合使用,设置临时文件的路径(绝对路径)
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传内容的大小限制(单位:字节)
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List<?> items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
//如果是普通表单字段
String name = item.getFieldName();
String value = item.getString();
...
} else {
//如果是文件字段
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
...
// Process a file upload
if (writeToFile) {
File uploadedFile = new File(...);
item.write(uploadedFile);
} else {
InputStream uploadedStream = item.getInputStream();
...
uploadedStream.close();
}
}
}
2. cos示例代码:
view plaincopy to clipboardprint?
01.// 设置大小限制(单位:字节)
02.final int permitedSize = 314572800;
03.
04.try {
05. String type = "";
06. String name = "";
07. String originalFilename = "";
08. String extension1 = "";
09. String extension2 = "";
10. String filename = "";
11.
12. //上传目录
13. String strDirectory = "files";
14. String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");
15.
16. // 获取句柄
17. MultipartRequest multipartRequest = new MultipartRequest(request, uploadPath,
18. permitedSize, "ISO-8859-1", new DefaultFileRenamePolicy());
19.
20. // 取得文件
21. Enumeration files = multipartRequest.getFileNames();
22.
23. // 取得文件详细信息
24. while (files.hasMoreElements()) {
25. name = (String)files.nextElement();
26. type = multipartRequest.getContentType(name);
27. filename = multipartRequest.getFilesystemName(name);
28. originalFilename = multipartRequest.getOriginalFileName(name);
29. File currentFile = multipartRequest.getFile(name);
30. ...
31. }
32.
33. // 取得其它非文件字段
34. Enumeration params = multipartRequest.getParameterNames();
35.
36. while (params.hasMoreElements()) {
37. String name = (String)params.nextElement();
38. String value = multi.getParameter(name);
39. ...
40. }
41.} catch (Exception exception) {
42. response.sendError(response.SC_METHOD_NOT_ALLOWED);
43.} finally {
44. if (out != null) {out.close();}
45.}
[java] view plaincopyprint?
01.// 设置大小限制(单位:字节)
02.final int permitedSize = 314572800;
03.
04.try {
05. String type = "";
06. String name = "";
07. String originalFilename = "";
08. String extension1 = "";
09. String extension2 = "";
10. String filename = "";
11.
12. //上传目录
13. String strDirectory = "files";
14. String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");
15.
16. // 获取句柄
17. MultipartRequest multipartRequest = new MultipartRequest(request, uploadPath,
18. permitedSize, "ISO-8859-1", new DefaultFileRenamePolicy());
19.
20. // 取得文件
21. Enumeration files = multipartRequest.getFileNames();
22.
23. // 取得文件详细信息
24. while (files.hasMoreElements()) {
25. name = (String)files.nextElement();
26. type = multipartRequest.getContentType(name);
27. filename = multipartRequest.getFilesystemName(name);
28. originalFilename = multipartRequest.getOriginalFileName(name);
29. File currentFile = multipartRequest.getFile(name);
30. ...
31. }
32.
33. // 取得其它非文件字段
34. Enumeration params = multipartRequest.getParameterNames();
35.
36. while (params.hasMoreElements()) {
37. String name = (String)params.nextElement();
38. String value = multi.getParameter(name);
39. ...
40. }
41.} catch (Exception exception) {
42. response.sendError(response.SC_METHOD_NOT_ALLOWED);
43.} finally {
44. if (out != null) {out.close();}
45.}
// 设置大小限制(单位:字节)
final int permitedSize = 314572800;
try {
String type = "";
String name = "";
String originalFilename = "";
String extension1 = "";
String extension2 = "";
String filename = "";
//上传目录
String strDirectory = "files";
String uploadPath = request.getRealPath("//WEB-INF//"+strDirectory+"//");
// 获取句柄
MultipartRequest multipartRequest = new MultipartRequest(request, uploadPath,
permitedSize, "ISO-8859-1", new DefaultFileRenamePolicy());
// 取得文件
Enumeration files = multipartRequest.getFileNames();
// 取得文件详细信息
while (files.hasMoreElements()) {
name = (String)files.nextElement();
type = multipartRequest.getContentType(name);
filename = multipartRequest.getFilesystemName(name);
originalFilename = multipartRequest.getOriginalFileName(name);
File currentFile = multipartRequest.getFile(name);
...
}
// 取得其它非文件字段
Enumeration params = multipartRequest.getParameterNames();
while (params.hasMoreElements()) {
String name = (String)params.nextElement();
String value = multi.getParameter(name);
...
}
} catch (Exception exception) {
response.sendError(response.SC_METHOD_NOT_ALLOWED);
} finally {
if (out != null) {out.close();}
}
3. SmartUpload示例代码:
view plaincopy to clipboardprint?
01.smartupload mysmartupload = new smartupload();
02.mysmartupload.initialize(this.getServletConfig(), request, response);
03.// 设置文件大小限制(单位:字节)
04.mysmartupload.setMaxFileSize(10000000);
05.// 设置总上传数据总大小(单位:字节)
06.mysmartupload.setTotalMaxFileSize(20000000);
07.// 设置允许的文件扩展名
08.mysmartupload.setAllowedFilesList("jpg,png,gif,bmp,jpeg");
09.// 设置不允许的文件扩展名
10.mysmartupload.setDeniedFilesList("exe,bat,jsp,htm,html,,");
11.
12.try {
13. mysmartupload.upload();
14.} catch (smartuploadException e1) {
15. e1.printStackTrace();
16.}
17.
18.// 读取其它非文件上传字段
19.com.jspsmart.upload.Request req = mysmartupload.getRequest();
20.String title = req.getParameter("dest");
21.
22.// 保存文件
23.for (int i = 0; i < mysmartupload.getFiles().getCount(); i++) {
24. com.jspsmart.upload.File file = mysmartupload.getFiles().getFile(i);
25.
26. if (file.isMissing()) continue;
27.
28. try {
29. file.saveAs("yourSavePath" + file.getFileName());
30. } catch (smartuploadException e) {
31. e.printStackTrace();
32. }
33.}