我正在尝试使用 JSF 2.2 new 让用户将照片上传到他的个人资料中。无论如何,我需要一个 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;
}
}
我正在使用带有Tomcat + Weld CDI和Primefaces 5.1的JSF的Mojarra 2.2.6实现,这与问题无关,因为我使用的是本机fileUpload组件,但是我只是为了让您知道我也尝试过使用它,它不适用于使用ajax的mode="advanced"
,这让我想知道这是否是我正在使用的库的某种不兼容或冲突。
您正在尝试使用 <h:inputFile/>
组件的 java 表示形式访问该文件;您不应该这样做。正如你所拥有的,file
应该绑定到javax.servlet.http.Part
的实例,你可以从中获取输入流。从这一点来看,其余的就非常简单了。您的代码如下所示:
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()
,可让您直接将文件写入指定目录