您的位置:首页 > Web前端

Primefaces4.0 JSF2.0 Liferay6.1开发中设置所允许上传文件的最大字节数

2014-07-18 13:59 555 查看
我现在的公司采用Primefaces4.0实现的JSF2.0加Liferay6.1开发项目,在开发中也遇到了不少问题,但是都得到了解决。最近遇到的上传文件不能超过200M字节的问题着实让我头疼了4天,好在我没有放弃,坚持要找出问题的关键,结果终于在今天上午搞定了,下面记录下自己解决问题的过程:

首先,在页面上上传大于100M的文件,只见Eclipse的Console输出类似下面的异常:

Caused by: org.apache.commons.fileupload.FileUploadBase$FileSizeLimitExceededException: The field A9441:j_idt6:j_idt8 exceeds its maximum permitted size of 104857600 bytes.

因为JSF是比较新的技术,而且在国内用得也比较少,懂JSF的人也少,我们公司用的人就更少了(当然同事也不懂),所以首先想到的是百度搜索,结果搜索出来的结果大多是在项目的WEB-INFO目录下的web.xml文件中增加过滤器,类似以下的代码:

<filter>

<filter-name>PrimeFaces FileUpload Filter</filter-name>

<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>

<init-param>

<param-name>thresholdSize</param-name>

<param-value>51200</param-value>

</init-param>

<init-param>

<param-name>uploadDirectory</param-name>

<param-value>/tmp</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>PrimeFaces FileUpload Filter</filter-name>

<servlet-name>Faces Servlet</servlet-name>

</filter-mapping>

<filter>

<filter-name>Pretty Filter</filter-name>

<filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>Pretty Filter</filter-name>

<url-pattern>/*</url-pattern>

<dispatcher>FORWARD</dispatcher>

<dispatcher>REQUEST</dispatcher>

<dispatcher>ERROR</dispatcher>

</filter-mapping>

照着这个配置弄了很久,结果还是报错,意思就是文件大小已经超过了100M字节的最大限制。你妹啊,继续。

其次,继续搜索,出来类似如下的代码:

<filter>

<filter-name>multipartFilter</filter-name>

<filter-class>net.sourceforge.myfaces.custom.fileupload.MultipartFilter</filter-class>

<init-param>

<param-name>maxFileSize</param-name>

<param-value>30m</param-value>

<description>Set the size limit for uploaded files.

Format: 10 - 10 bytes

10k - 10 KB

10m - 10 MB

</description>

</init-param>

</filter>

<filter-mapping>

<filter-name>multipartFilter</filter-name>

<url-pattern>*.jsf</url-pattern>

</filter-mapping>

这个是用myfaces的,可我们用的Primefaces的啊,没用,继续。

再次,中文网站搜索不到能解决问题的答案,看看英文的呢,结果使用Google搜索,搜索到一些结果,但是有的打不开,有的打开也是类似文章开头的那些结果的,明显是配置不出来的了,也试过在portal.properties、portal-ext.properties、system-ext.properties文件里添加设置,结果也不行;既然Goolge得了间隙性抽疯症,那哥就试试yahoo搜索吧,可是得到的结果还是没有解决问题,继续。

最后,看来网上是找不到能解决问题的答案了,只有自己动手研究了。仔细看了下程序所报的异常,发现这个异常是在RequestParameterMapMultiPartImpl类中抛出的,这个类在liferay-faces-bridge-impl-3.1.0-rc2.jar包中,于是采用JAD(0.6.2)反编译出liferay-faces-bridge-impl-3.1.0-rc2.jar,找到了RequestParameterMapMultiPartImpl类,于是就发现里面定义了几个常量其中一个就是CONTEXT_PARAM_UPLOADED_FILE_MAX_SIZE其值为javax.faces.UPLOADED_FILE_MAX_SIZE,好了,这就是问题的关键所在,但是不知道是在那个地方设置的,于是往下找,看到了 String
uploadedFilesMaxSize = bridgeContext.getInitParameter("javax.faces.UPLOADED_FILE_MAX_SIZE");接着是 logger.debug("The web.xml context-param name=[{0}] not found, using default=[{1}] bytes", new Object[] { "javax.faces.UPLOADED_FILE_MAX_SIZE", Integer.valueOf(104857600)
});于是突然就释怀了,这不是在web.xml文件中的设置吗?

于是在项目的WEB-INF目录下的web.xml文件中的 <context-param>

<param-name>com.sun.faces.expressionFactory</param-name>

<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>

</context-param>

<context-param>

<param-name>javax.faces.PROJECT_STAGE</param-name>

<param-value>Development</param-value>

</context-param>后面增加了一个上传文件的最大值限制的参数:

<context-param>

<param-name>javax.faces.UPLOADED_FILE_MAX_SIZE</param-name>

<param-value>209715200</param-value>

</context-param>

高高兴兴地重新上传一个大于100M字节的文件,哈哈,Eclipse的Console里终于没有出现满篇的红色文字了,这就是程序员所希望的结果,问题终于搞定。

最后感叹一下这句话“只要功夫深,铁棒磨成针”!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: