javax.servlet.http.Part没有使用<h:inputfile> </h:inputfile>转移到服务器端

时间:2014-11-20 20:00:56

标签: jsf primefaces jsf-2.2

我正在尝试使用JSF 2.2 new来让用户将photografy上传到他的个人资料中。无论如何,我需要一个Ajax行为,我用以下代码片段实现了这个行为:

<h:form enctype="multipart/form-data">
    <h:inputFile value="#{usuarioController.part}">
        <f:ajax listener="#{usuarioController.uploadImage}"/>
    </h:inputFile>
</h:form>

但目前我的public void uploadImage() javax.servlet.http.Part部分仍然为空。

这是控制器:

@Named(value="usuarioController")
@SessionScoped
public class UsuarioController extends GenericPersonificacaoCrudController<Usuario>{
    private static final long serialVersionUID = 3233882970467365819L;
    private Part part;

    public void uploadImage(){
        System.out.println(part);
    }

    public Part getPart() {
        return part;
    }

    public void setPart(Part part) {
        this.part = part;
    }
}

我正在使用Mojarra 2.2.6实现JSF与Tomcat + Weld CDI和Primefaces 5.1,这与我使用本机fileUpload组件的问题无关,但我只是为了让你知道我也尝试过使用它并且它不能与使用ajax的mode="advanced"一起使用,这让我想知道它是否与我正在使用的库之间存在某种不兼容或冲突。

1 个答案:

答案 0 :(得分:0)

您正尝试使用<h:inputFile/>组件的java表示来访问该文件;你不应该这样做。正如您所知,file应绑定到javax.servlet.http.Part的实例,您可以从中获取InputStream。从那时起,其余部分非常简单。您的代码看起来像这样:

public Part file;
//getter and setter

public void uploadImagem(){

    long fileSize = file.getSize();
    byte[] fileStorage = new byte[fileSize];
    BufferedInputStream bis = new BufferedInputStream(file.getInputStream);
    bis.read(fileStorage);

    //do whatever you want with the array.

}

提示:您还应该知道Part还有一个便捷方法write(),允许您直接将文件写入指定目录