天天看点

richfaces的fileupload说明

官网关于fileupload标签的说明:http://docs.jboss.org/richfaces/3.3.2.GA/en/devguide/html/rich_fileUpload.html

       首先,这里使用的版本是:3.3.2sr1,使用richfaces组件先得加入相关包,

其中用到了facelets,所以有jsf-facelets.jar

web.xml中的richfaces过滤器

<filter>

        <display-name>RichFaces Filter</display-name>

        <filter-name>richfaces</filter-name>

        <filter-class>org.ajax4jsf.Filter</filter-class>

<!--初始化参数在这里配置-->

    </filter>

    <filter-mapping>

        <filter-name>richfaces</filter-name>

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

        <dispatcher>REQUEST</dispatcher>

        <dispatcher>FORWARD</dispatcher>

        <dispatcher>INCLUDE</dispatcher>

    </filter-mapping>

上传bean(FileUploadBean):

import java.io.IOException;

import java.io.OutputStream;

import java.util.ArrayList;

import org.richfaces.event.UploadEvent;

import org.richfaces.model.UploadItem;

public class FileUploadBean {

    public FileUploadBean() {

    }

private ArrayList<File> files = new ArrayList<File>();

    private int uploadsAvailable = 5;

    private boolean autoUpload = false;

    private boolean useFlash = false;

    public int getSize() {

        if (getFiles().size()>0){

            return getFiles().size();

        }else

        {

            return 0;

        }

    }

    public void paint(OutputStream stream, Object object) throws IOException {

        stream.write(getFiles().get((Integer)object).getData());

    }

    public void listener(UploadEvent event) throws Exception{

        UploadItem item = event.getUploadItem();

        File file = new File(); //自己定义的类型,不IO包中的File

        file.setLength(item.getFileSize());

        file.setName(item.getFileName());

        file.setData(item.getData());

        files.add(file);

        uploadsAvailable--;

    }

}

在faces-config.xml中配置:

<faces-config version="1.2"

    xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">

<!--如果不使用facelets下面的FaceletViewHandler可以注解-->

    <application> 

        <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>

    </application>

    <managed-bean>

        <managed-bean-name>fileUploadBean</managed-bean-name>

        <managed-bean-class>com.FileUploadBean</managed-bean-class>

        <managed-bean-scope>request</managed-bean-scope>

    </managed-bean>

</faces-config>

页面组件:

  <rich:fileUpload

                maxFilesQuantity="3"

                noDuplicate="true"

                fileUploadListener="#{fileUploadBean.listener}"

                addControlLabel="Add file..."

                clearAllControlLabel="Clear all"

                clearControlLabel="Clear"

                stopEntryControlLabel="Stop process"

                uploadControlLabel="Upload file"

                id="upload"

                immediateUpload="false"

                acceptedTypes="jpg, gif, png, bmp" allowFlash="true">

                <f:facet name="label">

                    <h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}" />

                </f:facet>

            </rich:fileUpload>

属性说明:noDuplicate="true" 本次上传的文件中不能有重复文件

                 acceptedTypes="jpg, gif, png, bmp" 上传所允许的文件格式,这个格式就是个结尾字符串而已,你把一个不是图片的文件改成这样的文件照样是可以上传的

                 allowFlash="true" 在打开的文件选择窗口中自动筛选符合文件格式(acceptedTypes)的文件

这里要注意的fileUploadBean.listener方法

在这个方法里面

UploadItem item = event.getUploadItem();

      有几个文件就要调用几次listener方法,除非调用一次得到所有文件,而且我们得知道在调用这个方法之前文件已经存在于服务上了(以内存或者临时文件的形式)。如果有三个文件要上传,并不是说三个都在了,而是轮到哪个文件调用listener的时候,这个文件已经上传过了,剩下的工作就是程序员处理文件了。

       再多讲点儿,jsf的上传组件在上传的过程中都是在Filter中就完成了上传任务,因为JSF的生命周中不能处理带有这种流形式的请求,上传完后,将文件的引用设置到请求中,交给jsf的生命周期进行处理(也就是listener处理了)

       若要得到一个文件的上传信息,通过item.isTempFile()来判断这个文件是以临时文件方式存在还是以byte[]方式存在(意思是说在内存里面),如果它返回true,则是临时文件,会在服务器的临时目录下(eg. tomcat_home/temp)生成.upload的临时文件(如果是另外生成文件的话这里的临时文件一定要记得删除掉,如果是只是重命名(移动文件),则不需要)这时候要保存文件就要通过item.getFile获得文件并处理;如果它返回的false,则上传的文件在内存里面,要通过item.getData()获得byte数组来处理,如果上传的文件比较大的话,这种方式不推荐使用。

如果是临时文件你调用getData方法得到的是null值,如果还要获取数组大小则会报空指针异常;如果是以内存的方式存在,用getFile得到的也是null值。

如果不在RichFace过滤器(web.xml中)配置以什么方式存储上传文件时,默认方式为临时文件方式。

如果要改为内存方式存储(小文件推荐,大小界线自己衡量),在过滤器中加入

<init-param>

        <param-name>createTempFiles</param-name>

        <param-value>false</param-value>

</init-param>