我正在尝试使用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"
一起使用,这让我想知道它是否与我正在使用的库之间存在某种不兼容或冲突。
答案 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()
,允许您直接将文件写入指定目录