RichFaces fileupload和NullPointerException

时间:2011-03-15 21:54:26

标签: richfaces seam file-upload

我正在尝试使用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 ......但是没有答案......

谢谢!

2 个答案:

答案 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

的fileUploadListener
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)。

希望这有帮助