使用 <p:fileUpload mode="simple"> 上传文件时 UploadedFile 为空
UploadedFile is null when uploading file with <p:fileUpload mode="simple">
我需要上传一张图片到服务器。
我正在使用 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()
,改了作用域等等……还是不行。这是怎么造成的,我该如何解决?
当浏览器无法将文件内容与请求正文一起发送时,或者当服务器无法从请求正文中获取文件内容时,将在操作方法中null
。
为了让浏览器发送文件内容(因此不仅仅是名称),您需要确保请求正文编码类型设置为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.
我需要上传一张图片到服务器。 我正在使用 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()
,改了作用域等等……还是不行。这是怎么造成的,我该如何解决?
当浏览器无法将文件内容与请求正文一起发送时,或者当服务器无法从请求正文中获取文件内容时,将在操作方法中null
。
为了让浏览器发送文件内容(因此不仅仅是名称),您需要确保请求正文编码类型设置为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.