获取primefaces p:fileUpload在google appengine下工作

时间:2012-04-08 18:36:00

标签: apache google-app-engine jsf jsf-2 primefaces

我已经读过,有可能让primefaces fileUpload与google appengine配合使用,并进行一些调整。它需要apache fileupload和common io,所以我将commons-fileupload-1.2.2.jar和commons-io-1.3.2.jar添加到我的WEB-INF / lib文件夹中。

然后按照primefaces的说明,我添加了他们的servlet:

<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>2147483647</param-value>
    </init-param>       
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>  

thresholdTize有意地设置为高,因为它是将文件保存到磁盘而不是将其保留在内存中的字节数,并且由于没有使用google appengine保存文件,因此它永远不是一个选项。

实际用法如下:

<h:form enctype="multipart/form-data">
    <!-- Other text fields go here -->
    <p:fileUpload fileUploadListener="#{tjBean.onHandleFileUpload}"  
        mode="advanced"  
        update=":toolbarForm:globalMessages"  
        sizeLimit="500000"   
        allowTypes="/(\.|\/)(txml)$/" /> 
<p:commandButton value="Okay" ajax="false" actionListener="#{tjBean.onSaveAction}" />
</h:form>

我已经明白commandButton不能使用ajax并且它必须是整页重新加载。它似乎让我上传文件没有故障,但actionListener永远不会被触发。然后使用commandButton提交表单会触发异常:

java.lang.NoClassDefFoundError: Could not initialize class org.apache.commons.fileupload.disk.DiskFileItem
    at org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:199)
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:361)
...

我不确定我做错了什么,或者我只是没有获得适当版本的apache库来使其正常工作。我正在使用的primefaces的版本是3.2。当我搜索这个问题的解决方案时,常见的反应是google appengine不喜欢我正在尝试将文件保存到磁盘的事实,而解决方案只是增加阈值,但阈值是尽可能高,所以它甚至不应该尝试将文件保存到磁盘。

我很感激任何帮助或建议,特别是如果解决方案显而易见并且我还没有看到它。提前谢谢。

3 个答案:

答案 0 :(得分:1)

Neil,你不能写入磁盘(即你不能在GAE上使用fileupload.disk)。

App Engine文件系统对您的应用程序始终是只读的。 您可能会考虑的几种替代方案是:

另外,看看这个: http://primefaces-rocks.appspot.com/ui/fileUploadSimple.jsf

答案 1 :(得分:1)

通过覆盖Apache fileupload library 1.2.2的DiskItem来解决此问题。

具体来说,注释的静态字符串UID(使用列入黑名单的类java.rmi.server.UID)和写入方法的全部内容(我将阈值设置为高,因此它永远不需要调用它)。

显然这不是理想的解决方案,但只要我不需要更新文件上传库就可以使用,我怀疑在不久的将来我需要这样做。

答案 2 :(得分:1)

@Neil

对不起,我不能发表评论。你能告诉我你如何改变方法

getTempFile() {
        if (tempFile == null) {
            File tempDir = repository;
            if (tempDir == null) {
                tempDir = new File(System.getProperty("java.io.tmpdir"));
            }

            String tempFileName = format("upload_%s_%s.tmp", UID, getUniqueId());

            tempFile = new File(tempDir, tempFileName);
        }
        return tempFile;
    }

你使用了什么而不是UID?