javax.servlet.http.Part 未使用 <h:inputFile 传输到服务器端>



我正在尝试使用 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(),可让您直接将文件写入指定目录

最新更新