使用<p:fileupload mode =“simple”>上载文件时,UploadedFile为null

时间:2015-05-07 20:45:17

标签: jsf file-upload primefaces nullpointerexception

我需要将图像上传到服务器。 我正在使用primefaces,这是我的代码:

deposit.xhtml

<h:form>
    <p:fileUpload mode="simple"
        allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
        value="#{imageHandler.uploadedPicture}" />

    <p:commandButton action="#{imageHandler.savefile(imageHandler.uploadedPicture)}" 
        value="Déposer" ajax="false" />
</h:form>

ImageHandler

@ManagedBean (name = "imageHandler")
@RequestScoped
public class ImageHandler {

    private UploadedFile uploadedPicture; // +getter+setter

    public void savefile(UploadedFile uploadedPicture)
    {
        try {
            InputStream input = uploadedPicture.getInputstream();
            File folder = new File("C:\\Users\\Clyde\\Documents\\NetBeansProjects\\DSJEE\\web\\resources\\Items");
            String filename = FilenameUtils.getBaseName(uploadedPicture.getFileName()); 
            String extension = FilenameUtils.getExtension(uploadedPicture.getFileName());
            File file = File.createTempFile(filename + "-", "." + extension, folder);
            Files.copy(input, file.toPath());
            FacesContext.getCurrentInstance().getExternalContext().redirect("index2.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(ImageHandler.class.getName()).log(Level.SEVERE, null, ex);
        }      
    }
}

关于此处的跟踪是我得到的错误,这些是我从跟踪中选择的3行:

javax.faces.el.EvaluationException: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
at ImageHandler.savefile(ImageHandler.java:43)

换句话说,它来自这里:

InputStream input = uploadedPicture.getInputstream();

我已经尝试了很多东西来摆脱这个错误。我使用savefile()没有参数,改变了范围等...仍然无法继续。这是怎么造成的,我该如何解决?

1 个答案:

答案 0 :(得分:4)

当浏览器无法与请求正文一起发送文件内容时,或者当服务器无法从请求正文中获取文件内容时,操作方法中将为null

为了让broswer发送文件内容(因而不仅仅是名称),您需要确保请求正文编码类型设置为multipart/form-data。这可以通过将表单的enctype属性设置如下来实现:

<h:form enctype="multipart/form-data">

无关具体问题,以下没有意义:

<p:commandButton action="#{imageHandler.savefile(imageHandler.uploadedPicture)}">

您不需要将bean属性传递回同一个bean。只需让action方法直接访问它。

<p:commandButton action="#{imageHandler.savefile}">

此外,尝试将上载的文件保存在IDE项目文件夹中是一个坏主意。不要这样做。存放在别处。另见a.o. Uploaded image only available after refreshing the page