我正在尝试使用rich:fileUpload将文件上传到服务器,这是代码:
@Name("fileUploader")
public class FileUploader {
private byte[] fileData;
public void uploadFileListener(UploadEvent uploadEvent) {
fileData = uploadEvent.getUploadItem().getData();
//other code here
}
}
页面包含以下内容:
rich:fileUpload fileUploadListener="#{fileUploader.uploadFileListener}"
我得到的是uploadEvent包含有关文件名,大小等的数据......但是
的 uploadEvent.getUploadItem()的getData();
返回null ...
我已经看到了类似的问题here ......但是没有答案......
谢谢!
答案 0 :(得分:1)
您是否在组件xml中配置了multipart-filter?
这样的事情:
<web:multipart-filter create-temp-files="true" max-request-size="1000000" url-pattern="*.seam"/>
更新:我不完全确定这是用于s:fileUpload还是rich:fileUpload。在考虑此配置之前,请检查下面的代码。默认情况下,如果我没记错的话,你应该使用临时文件,这是我认为RichFaces的默认配置。对不起,我在这里没有我的项目来检查它。
如果您将其配置如上所述,您的文件将保存到临时文件(create-temp-files =“true”),在这种情况下,您应该使用
访问您的数据uploadEvent.getUploadItem().getFile()
您可以检查它是否存储在包含以下内容的文件中:
uploadEvent.getUploadItem().isTempFile()
既然你说文件“元数据”在那里,这看起来就是问题,你只是在错误的地方寻找你的数据:)
如果您将其配置为false,则您的方法应该有效。
我还记得上传控件(rich:upload)需要在h:form
中的内容(不完全确定)希望它有所帮助。
答案 1 :(得分:0)
让我们按顺序排列:
首先,您必须定义是否要将数据直接上载到byte[]
缓冲区或临时文件中,并且支持最大大小。这就是为什么你必须在某个地方定义两个参数。
现在,您需要定义这些参数的位置取决于您使用的组件(即seam fileUpload组件或richfaces fileUpload组件)以及为您的应用程序安装的技术。我们来看看:
如果你使用带有richfaces的seam框架并且你不需要ajax支持(即显示上传完成后加载的图像),<s:fileUpload>
将是一个不错的选择,配置它你必须改变你的接缝components.xml
以这种方式存档:
<web:multipart-filter create-temp-files="true"
max-request-size="1000000"
url-pattern="*.seam" />
这意味着您发送到服务器的数据将保存在临时文件中,并且支持的最大大小为1000000
(大约1M)。更多信息可以在这里找到:http://seamframework.org/Documentation/HowToUploadAndDownloadFilesInSeam
现在使用相同的技术堆栈(seam + richfaces),但在这种情况下,您需要使用ajax支持。在这种情况下,<rich:fileUpload>
将是您的选择。要配置它,只需在web.xml
文件中定义的Seam过滤器中更改它:
<filter>
<filter-name>Seam Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
<init-param>
<param-name>createTempFiles</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>maxRequestSize</param-name>
<param-value>10000000</param-value>
</init-param>
</filter>
请注意,虽然参数在两种情况下都是相同的,但它们在不同的地方定义 - 我想这在JEE6中用CDDI改变了。
如果您的应用程序不使用seam框架,但它确实使用了richfaces,您可能需要在web.xml
中再次在相应的richfaces过滤器中定义此参数。
现在有趣的部分,<rich:fileUpload>
的用法。这是名为BlockEdit.xhtml
的文件的相关部分,其中使用了该组件:
<rich:fileUpload
fileUploadListener="#{blockHome.sketchListener}"
maxFilesQuantity="1"
reRender="table"
id="upload"
immediateUpload="true"
acceptedTypes="jpg, gif, png, bmp">
<a:support event="onuploadcomplete" reRender="sketchImage" />
</rich:fileUpload>
这是BlockHome.java
public void sketchListener(UploadEvent event) {
UploadItem item = event.getUploadItem();
logger.info("Sketch listener executed ...");
if(item != null && item.getData() != null) {
logger.info(item.getFileName()+" "+item.getFileSize());
getInstance().getSketch().setData(item.getData());
getInstance().getSketch().setName(item.getFileName());
getInstance().getSketch().setContentType(item.getContentType());
getInstance().getSketch().setSize(item.getFileSize());
}
}
如果您在web.xml中的seam过滤器内的createTempFiles
配置为:
<init-param>
<param-name>createTempFiles</param-name>
<param-value>false</param-value>
</init-param>
然后item.getData()将不为null。但是如果你将参数createTempFiles
定义为true
,那么你应该询问item.getFile(),如果你想知道它是否有值。这是因为当您决定避免创建临时文件时,就会填充item.getData(),如Richfaces demo fileUpload documentation中所述。
FileUpload使用两个init参数,这些参数应在Filter中定义 web.xml中的定义:
createTempFiles
布尔属性,用于定义是否 上传的文件存储在临时文件中或在侦听器中可用 就像byte []数据一样(本例中为false)。maxRequestSize
属性定义的最大大小(以字节为单位) 上传的文件(本例为1000000)。
希望这有帮助