Eclipse Tomcat can';是否无法保存到临时文件夹?

Eclipse Tomcat can';是否无法保存到临时文件夹?,eclipse,tomcat,jsf,primefaces,image-uploading,Eclipse,Tomcat,Jsf,Primefaces,Image Uploading,我正在为期末考试制作一个简单的JSF应用程序。它基本上是一个带有图片和一些基本数据上传(文本等)的页面应用程序。图片上传部分出现了问题。我使用Primefaces单文件上传: <h:form> ... <p:fileUpload id="slike" fileUploadListener="#{oglasBean.handleFileUpload}" cancelLabel="Otkaži" label="Dodaj" mode="advanced" dragDro

我正在为期末考试制作一个简单的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>
用于添加到数据库的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);
    }
}

}
它在刀的旁边断了

InputStream instream = oglas.getSlika().getInputstream();
我谨此致辞:

java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 7.0\work\Catalina\localhost\TravelAdvertiser\upload_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)
...
java.io.FileNotFoundException:C:\Program Files\Apache Software Foundation\Tomcat 7.0\work\Catalina\localhost\TravelAdvertiser\upload\u fd4813af\u 24f6\u 485e\u a865\u 5aa9be1a871d\u 00000019.tmp(系统找不到指定的文件)
位于java.io.FileInputStream.open0(本机方法)
位于java.io.FileInputStream.open(未知源代码)
位于java.io.FileInputStream。(未知源)
位于org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.getInputStream(DiskFileItem.java:188)
位于org.apache.catalina.core.ApplicationPart.getInputStream(ApplicationPart.java:99)
位于org.primefaces.model.NativeUploadedFile.getInputstream(NativeUploadedFile.java:45)
在net.etfbl.traveladvertiser.DAO.OglasDAO.dodajOglas(OglasDAO.java:17)
在net.etfbl.traveladvertiser.beans.OglasBean.dodajOglas(OglasBean.java:67)上
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
...
我猜Tomcat由于某种原因无法写入临时文件夹。奇怪的是,它实际上包含了我昨天用这个应用上传的一些文件,而且它已经停止工作了。所以,也许问题是我忘记了代码中的一些小东西(做了很多更改和实验)


非常感谢

感谢@Kukeltje的评论,我在上找到了答案

它是:

还要注意,您应该立即在上述方法中读取文件内容,而不是在稍后HTTP请求调用的其他bean方法中读取。这是因为上传的文件内容属于请求范围,因此在以后的/不同的HTTP请求中不可用。在以后的请求中读取它的任何尝试都很可能在临时文件上以java.io.FileNotFoundException结束

我似乎做错了,我试图在handleFileUpload方法中设置Bean属性,然后在下一个请求中用另一个方法读取该属性,但该方法不再可用。为了解决这个问题,我用handleFileUpload方法将其保存到数据库中,然后通过另一种方法更新其他字段。也许不是最漂亮或最优的解决方案,但它现在对我来说很有效


谢谢大家的快速回复!!!离考试只有几天了,这种帮助是无价的

尝试将Java.io.tmpdir设置到另一个目录,看看这是否有帮助您认为tomcat为什么不能保存到该文件夹?错误在于阅读。可能文件已写入但已删除。是否尝试在您的
handleFileUpload
方法中读取它?最好的测试,容易实现。。(以及调试中的正常步骤)无需回答,因为副本包含所有信息。如果你认为需要所有答案,请礼貌地向帮助你写答案的人询问。如果你需要在数据库中找到答案,ut是最漂亮的方法end@Kukeltje好的,谢谢你的建议。我回答这个问题主要是因为有人可能有同样的问题,而且,像我一样,无法通过搜索找到正确的答案;)如果你认为这个答案是多余的或误导性的,我很乐意遵守并删除它。是的,但是为什么他们会找到你的答案呢?;-)
java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 7.0\work\Catalina\localhost\TravelAdvertiser\upload_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)
...