Java web中,当表单含有文件上传时,提交数据的如何读取

当提交表单里包含文件上传的时候,即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.} 


你可能感兴趣的:(Java Web)