我已经读过,有可能让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不喜欢我正在尝试将文件保存到磁盘的事实,而解决方案只是增加阈值,但阈值是尽可能高,所以它甚至不应该尝试将文件保存到磁盘。
我很感激任何帮助或建议,特别是如果解决方案显而易见并且我还没有看到它。提前谢谢。
答案 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?