JSF2.0虽然添加了很多新特性,但是还是没有官方的对上传的支持。直接使用
<h:form enctype="multipart/form-data" >
</h:form>
是不行的。因为multipart/form-data类型的request是解析不了的。
解决方法可以使用filter对request进行包装(原request似乎是不能更改的,所以借助包装),在解析request是可以借助apache的commons-fileupload组件。
Myfaces刚好给出了这个解决方案的实现:
MultipartFilter+MultipartRequestWrapper(Use commons-fileupload).
原来是打包在一个myfaces-extensions.jar中,现在找不到官方的下载,不过在Tomahawk包里可以找到(org.apache.myfaces.webapp.filter.*,MultipartFilter似乎都弄到ExtensionsFilter里了)。
个人觉得旧版的源代码挺参考价值的,贴出来分享下。
MultipartRequestWrapper:
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 16 package org.apache.myfaces.component.html.util;
- 17
- 18 import org.apache.commons.fileupload.*;
- 19 import org.apache.commons.logging.Log;
- 20 import org.apache.commons.logging.LogFactory;
- 21
- 22 import javax.servlet.http.HttpServletRequest ;
- 23 import javax.servlet.http.HttpServletRequestWrapper ;
- 24 import java.io.UnsupportedEncodingException ;
- 25 import java.util.*;
- 26
- 27
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 56 public class MultipartRequestWrapper
- 57 extends HttpServletRequestWrapper
- 58 {
- 59 private static Log log = LogFactory.getLog(MultipartRequestWrapper.class);
- 60
- 61 HttpServletRequest request = null;
- 62 HashMap parametersMap = null;
- 63 DiskFileUpload fileUpload = null;
- 64 HashMap fileItems = null;
- 65 int maxSize;
- 66 int thresholdSize;
- 67 String repositoryPath;
- 68
- 69 public MultipartRequestWrapper(HttpServletRequest request,
- 70 int maxSize, int thresholdSize,
- 71 String repositoryPath){
- 72 super( request );
- 73 this.request = request;
- 74 this.maxSize = maxSize;
- 75 this.thresholdSize = thresholdSize;
- 76 this.repositoryPath = repositoryPath;
- 77 }
- 78
- 79 private void parseRequest() {
- 80 fileUpload = new DiskFileUpload();
- 81 fileUpload.setFileItemFactory(new DefaultFileItemFactory());
- 82 fileUpload.setSizeMax(maxSize);
- 83
- 84 fileUpload.setSizeThreshold(thresholdSize);
- 85
- 86 if(repositoryPath != null && repositoryPath.trim().length()>0)
- 87 fileUpload.setRepositoryPath(repositoryPath);
- 88
- 89 String charset = request.getCharacterEncoding();
- 90 fileUpload.setHeaderEncoding(charset);
- 91
- 92
- 93 List requestParameters = null;
- 94 try{
- 95 requestParameters = fileUpload.parseRequest(request);
- 96 } catch (FileUploadBase.SizeLimitExceededException e) {
- 97
- 98
- 99
- 100 if(log.isInfoEnabled())
- 101 log.info("user tried to upload a file that exceeded file-size limitations.",e);
- 102
- 103 requestParameters = Collections.EMPTY_LIST;
- 104
- 105 }catch(FileUploadException fue){
- 106 log.error("Exception while uploading file.", fue);
- 107 requestParameters = Collections.EMPTY_LIST;
- 108 }
- 109
- 110 parametersMap = new HashMap( requestParameters.size() );
- 111 fileItems = new HashMap();
- 112
- 113 for (Iterator iter = requestParameters.iterator(); iter.hasNext(); ){
- 114 FileItem fileItem = (FileItem) iter.next();
- 115
- 116 if (fileItem.isFormField()) {
- 117 String name = fileItem.getFieldName();
- 118
- 119
- 120
- 121
- 122
- 123
- 124 String value = null;
- 125 if ( charset == null) {
- 126 value = fileItem.getString();
- 127 } else {
- 128 try {
- 129 value = new String (fileItem.get(), charset);
- 130 } catch (UnsupportedEncodingException e){
- 131 value = fileItem.getString();
- 132 }
- 133 }
- 134
- 135 addTextParameter(name, value);
- 136 } else {
- 137 if (fileItem.getName() != null) {
- 138 fileItems.put(fileItem.getFieldName(), fileItem);
- 139 }
- 140 }
- 141 }
- 142
- 143
- 144 for (Iterator it = request.getParameterMap().entrySet().iterator(); it.hasNext(); )
- 145 {
- 146 Map.Entry entry = (Map.Entry)it.next();
- 147 String [] valuesArray = (String [])entry.getValue();
- 148 for (int i = 0; i < valuesArray.length; i++)
- 149 {
- 150 addTextParameter((String )entry.getKey(), valuesArray[i]);
- 151 }
- 152 }
- 153 }
- 154
- 155 private void addTextParameter(String name, String value){
- 156 if( ! parametersMap.containsKey( name ) ){
- 157 String [] valuesArray = {value};
- 158 parametersMap.put(name, valuesArray);
- 159 }else{
- 160 String [] storedValues = (String [])parametersMap.get( name );
- 161 int lengthSrc = storedValues.length;
- 162 String [] valuesArray = new String [lengthSrc+1];
- 163 System.arraycopy(storedValues, 0, valuesArray, 0, lengthSrc);
- 164 valuesArray[lengthSrc] = value;
- 165 parametersMap.put(name, valuesArray);
- 166 }
- 167 }
- 168
- 169 public Enumeration getParameterNames() {
- 170 if( parametersMap == null ) parseRequest();
- 171
- 172 return Collections.enumeration( parametersMap.keySet() );
- 173 }
- 174
- 175 public String getParameter(String name) {
- 176 if( parametersMap == null ) parseRequest();
- 177
- 178 String [] values = (String [])parametersMap.get( name );
- 179 if( values == null )
- 180 return null;
- 181 return values[0];
- 182 }
- 183
- 184 public String [] getParameterValues(String name) {
- 185 if( parametersMap == null ) parseRequest();
- 186
- 187 return (String [])parametersMap.get( name );
- 188 }
- 189
- 190 public Map getParameterMap() {
- 191 if( parametersMap == null ) parseRequest();
- 192
- 193 return parametersMap;
- 194 }
- 195
- 196
- 197 public FileItem getFileItem(String fieldName) {
- 198 if( fileItems == null ) parseRequest();
- 199
- 200 return (FileItem) fileItems.get( fieldName );
- 201 }
- 202
- 203
-
-
-
- 207 public Map getFileItems(){
- 208 return fileItems;
- 209 }
- 210 }
MultipartFilter:
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 16 package org.apache.myfaces.component.html.util;
- 17
- 18 import java.io.IOException ;
- 19
- 20 import javax.servlet.Filter ;
- 21 import javax.servlet.FilterChain ;
- 22 import javax.servlet.FilterConfig ;
- 23 import javax.servlet.ServletException ;
- 24 import javax.servlet.ServletRequest ;
- 25 import javax.servlet.ServletResponse ;
- 26 import javax.servlet.http.HttpServletRequest ;
- 27 import javax.servlet.http.HttpServletResponse ;
- 28
- 29 import org.apache.commons.fileupload.FileUpload;
- 30
- 31
- 32
-
-
-
-
-
-
-
-
- 41 public class MultipartFilter implements Filter
- 42 {
- 43
- 44 private int uploadMaxFileSize = 100 * 1024 * 1024;
- 45
- 46 private int uploadThresholdSize = 1 * 1024 * 1024;
- 47
- 48 private String uploadRepositoryPath = null;
- 49
- 50
- 51 public void init(FilterConfig filterConfig)
- 52 {
- 53 uploadMaxFileSize = resolveSize(filterConfig.getInitParameter("uploadMaxFileSize"), uploadMaxFileSize);
- 54 uploadThresholdSize = resolveSize(filterConfig.getInitParameter("uploadThresholdSize"), uploadThresholdSize);
- 55 uploadRepositoryPath = filterConfig.getInitParameter("uploadRepositoryPath");
- 56 }
- 57
- 58
- 59 private int resolveSize(String param, int defaultValue)
- 60 {
- 61 int numberParam = defaultValue;
- 62
- 63 if (param != null)
- 64 {
- 65 param = param.toLowerCase();
- 66 int factor = 1;
- 67 String number = param;
- 68
- 69 if (param.endsWith("g"))
- 70 {
- 71 factor = 1024 * 1024 * 1024;
- 72 number = param.substring(0, param.length() - 1);
- 73 } else if (param.endsWith("m"))
- 74 {
- 75 factor = 1024 * 1024;
- 76 number = param.substring(0, param.length() - 1);
- 77 } else if (param.endsWith("k"))
- 78 {
- 79 factor = 1024;
- 80 number = param.substring(0, param.length() - 1);
- 81 }
- 82
- 83 numberParam = Integer.parseInt(number) * factor;
- 84 }
- 85 return numberParam;
- 86 }
- 87
- 88
- 89 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException , ServletException
- 90 {
- 91 if (!(response instanceof HttpServletResponse ))
- 92 {
- 93 chain.doFilter(request, response);
- 94 return;
- 95 }
- 96
- 97 HttpServletRequest httpRequest = (HttpServletRequest ) request;
- 98
- 99
- 100 if (FileUpload.isMultipartContent(httpRequest))
- 101 {
- 102 chain.doFilter(new MultipartRequestWrapper(httpRequest, uploadMaxFileSize, uploadThresholdSize, uploadRepositoryPath), response);
- 103 } else
- 104 {
- 105 chain.doFilter(request, response);
- 106 }
- 107 }
- 108
- 109
- 110 public void destroy()
- 111 {
- 112
- 113 }
- 114 }
分享到:
相关推荐
以上就是JSF文件上传和下载的基本实现。为了确保安全性和性能,还需要考虑错误处理、文件大小限制、临时文件管理以及用户权限控制等细节。同时,现代的Web开发中,还可能结合使用CDN(内容分发网络)和云存储服务来...
JSF(JavaServer Faces)是Java...对于希望学习或改进自己JSF文件上传功能的开发者来说,这是一个宝贵的资源。通过深入研究源代码,可以了解到如何处理大文件、如何优化上传性能以及如何确保上传过程的稳定性和安全性。
以下是对JSF文件上传的详细解释: 1. **依赖的库**: - `tomahawk-1.1.3.jar`:Apache MyFaces Tomahawk扩展库,提供了许多额外的JSF组件,包括文件上传组件。 - `commons-fileupload-1.2.jar`:Apache Commons ...
在JavaServer Faces (JSF)框架中,文件上传和下载是常见的功能,广泛应用于Web应用程序中,例如用户需要上传个人照片、下载文档等。本文将详细介绍如何在JSF环境中实现文件上传和下载,并提供一个可直接在Eclipse下...
1. 开发自定义组件:这是解决JSF文件上传问题的一种方法,通过编写自定义组件,可以扩展JSF的功能以支持文件上传。这通常涉及到解析multipart/form-data请求,处理文件流,并将其与后台的管理Bean进行交互。 2. ...
由于JSF2.0标准实现没有提供文件上传组件,而实际应用中很多时候需要上传文件,为了方便开发,我做了一个基于JSF2.0的文件上传组件,上传使用的是Apache 的commons-fileupload组件,我已经将commons-fileupload-...
在IT领域,特别是JavaWeb开发中,文件上传是一项常见的需求,尤其在使用JavaServer Faces(JSF)框架时。JSF是由Sun Microsystems开发并由Oracle维护的一个用于构建企业级Java Web应用程序的标准框架。然而,标准的...
**JSF实现的文件上传详解** JavaServer Faces (JSF) 是Java平台上的一个用于构建用户界面的组件模型框架,它允许开发人员创建基于Web的应用程序。在JSF中实现文件上传功能,不仅可以处理小文件,也能有效地上传大...
在JSF(JavaServer Faces)框架中实现文件上传功能,通常会涉及到多个依赖库,以处理文件上传的各个阶段,包括文件的解析、临时存储以及后续的业务逻辑处理。在这个场景下,`JSF上传文件用到的包`指的是一个项目中...
jsf官方实现默认是不支持multipart/form-data类型的表单的,为了使jsf能够解析multipart/form-data表单的数据,我参考了myfaces1.1的方式,然后按照commons-fileupload1.2...fileupload1.1)开发了一个文件上传组件。
本篇文章将深入探讨如何使用JSF组件实现文件上传功能,并结合描述和标签来阐述这一主题。 首先,我们需要理解JSF组件的工作原理。JSF是一种基于Java的MVC(模型-视图-控制器)框架,用于构建动态的、数据驱动的Web...
jsf结合ajax实现文件上传,值得阅读
在描述中提到,虽然Java Web标准如Servlets、JSP和JSF本身不直接支持文件上传功能,但可以通过第三方库如Apache Commons File Upload和Apache MyFaces等来实现。 Apache Commons File Upload是一个非常流行的Java库...
在本文中,我们将深入探讨如何使用JavaServer Faces (JSF) 2.0与Servlet 3.0结合实现文件上传功能。JSF是Java平台上的一种Web应用程序开发框架,而Servlet 3.0则是用于处理HTTP请求的核心Java API,两者结合可以提供...
本篇文章将深入探讨如何使用PrimeFaces的`<p:fileUpload>`组件在JSF应用中实现实时、便捷的文件上传。 首先,让我们了解`<p:fileUpload>`的基本用法。在JSF页面中,你可以通过以下方式引入这个组件: ```html ...
首先,我们需要了解JSF中的文件上传组件。JSF提供了一些内置的组件,如`<h:inputFile>`,用于在用户界面中创建一个文件上传表单。用户选择Excel文件后,文件会被暂时存储在服务器的临时目录中。 接着,我们需要处理...
### JSF实现基于Ajax的文件上传案例解析 #### 核心知识点概述 本文将深入探讨如何利用JavaServer Faces (JSF) 和 Ajax 技术来实现一个用户友好的文件上传组件。传统上,通过HTML `<input type="file">` 标签进行...
在**文件上传**过程中,JSF提供了`<h:inputFile>`组件来让用户选择要上传的文件。此组件通常会与后台的MVC模型结合,通过HTTP多部分请求将文件内容传递到服务器。服务器端则需要处理这些文件数据,可能涉及到文件的...