我需要将图像上传到服务器。 我正在使用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()
没有参数,改变了范围等...仍然无法继续。这是怎么造成的,我该如何解决?
答案 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