我正在为我的期末考试制作一个简单的JSF应用程序。它基本上是带有图片和一些基本数据上传(文本等(的单页应用程序。图片上传部分出现问题。我使用Primefaces单个文件上传:
<h:form>
...
<p:fileUpload id="slike" fileUploadListener="#{oglasBean.handleFileUpload}" cancelLabel="Otkaži" label="Dodaj"
mode="advanced" dragDropSupport="false" allowTypes="/(.|/)(gif|jpe?g|png)$/" update="poruka"/>
<div/>
<br />
<p:commandButton value="Dodaj oglas"
action="#{oglasBean.dodajOglas()}" />
...
</h:form>
后备 Bean 代码:
public void handleFileUpload(FileUploadEvent event) {
System.out.println(event.getFile().getFileName());
oglas.setSlika(event.getFile());
}
public void dodajOglas(){
Date datum = new Date();
oglas.setDatumKreiranja(datum);
if(oglas.getVrsta().equals("besplatan")){
oglas.setTrajanje(1);
oglas.setCijena(0);
}
else{
}
if (OglasDAO.dodajOglas(oglas)) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,"Uspješno ste dodali sliku.", "");
FacesContext.getCurrentInstance().addMessage(null, message);
}
else{
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,"Dodavanje slike nije uspjelo!", "");
FacesContext.getCurrentInstance().addMessage(null, message);
}
}
用于添加到数据库的 DAO 方法,实际上是问题出现的地方:
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import net.etfbl.traveladvertiser.model.Oglas;
public class OglasDAO {
private static String DODAJ_OGLAS = "insert into oglas values (tekst, slika,
vrsta, trajanje) values (?, ?, ?, ?)";
public static boolean dodajOglas(Oglas oglas){
Connection conn = null;
try{
conn = ConnectionPool.getConnectionPool().checkOut();
PreparedStatement stm = conn.prepareStatement(DODAJ_OGLAS);
InputStream instream = oglas.getSlika().getInputstream();
stm.setString(1, oglas.getTekst());
stm.setBinaryStream(2, instream, oglas.getSlika().getSize());
stm.setString(3, oglas.getVrsta());
stm.setInt(4, oglas.getTrajanje());
stm.executeUpdate();
stm.close();
return true;
}
catch(Exception ex){
ex.printStackTrace();
return false;
}
finally{
ConnectionPool.getConnectionPool().checkIn((com.mysql.jdbc.Connection) conn);
}
}
}
它在 DAO 的
InputStream instream = oglas.getSlika().getInputstream();
与消息:
java.io.FileNotFoundException: C:Program FilesApache Software FoundationTomcat 7.0workCatalinalocalhostTravelAdvertiserupload_fd4813af_24f6_485e_a865_5aa9be1a871d_00000019.tmp (The system cannot find the file specified)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.getInputStream(DiskFileItem.java:188)
at org.apache.catalina.core.ApplicationPart.getInputStream(ApplicationPart.java:99)
at org.primefaces.model.NativeUploadedFile.getInputstream(NativeUploadedFile.java:45)
at net.etfbl.traveladvertiser.DAO.OglasDAO.dodajOglas(OglasDAO.java:17)
at net.etfbl.traveladvertiser.beans.OglasBean.dodajOglas(OglasBean.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
我的猜测是Tomcat由于某种原因无法写入临时文件夹。奇怪的是,它实际上包含我昨天使用该应用程序上传的一些文件,并且它只是停止工作。所以,也许问题是我忘记了代码中的一些小东西(正在做很多更改和实验(?
非常感谢!!
感谢@Kukeltje评论,我找到了如何使用PrimeFaces p:fileUpload的答案?侦听器方法永远不会被调用,或者上传的文件为空/抛出错误/不可用。
是的:
另请注意,您应该立即在上述方法中读取文件内容,而不是在以后的 HTTP 请求调用的其他 Bean 方法中读取文件内容。这是因为上传的文件内容是请求范围的,因此在以后/不同的 HTTP 请求中不可用。任何在以后的请求中读取它的尝试都很可能以临时文件上的java.io.FileNotFoundException结束。
我做错了什么,似乎是我试图在handleFileUpload方法中设置Bean属性,然后在下一个请求中使用另一种方法读取该属性,在那里它不再可用。为了解决这个问题,我将其保存在handleFileUpload方法中的数据库中,然后通过另一种方法更新其他字段。也许不是最漂亮或最佳的解决方案,但它现在对我有用。
感谢大家的快速回复!!我离考试只剩下几天了,这种帮助是无价的!