Java 无法使用servlet将图像插入mysql数据库

Java 无法使用servlet将图像插入mysql数据库,java,mysql,filenotfoundexception,Java,Mysql,Filenotfoundexception,有人能帮我解决以下问题吗? 我试图通过一个servlet向mysql数据库中的blob列插入一个图像。 我是通过JSP文件中的“HTML文件输入类型”选择图像的,因此选择了图像的完整路径 我得到的错误是: HTTP Status 500 - Desert.jpg (The system cannot find the file specified) type Exception report message Desert.jpg (The system cannot find the fil

有人能帮我解决以下问题吗? 我试图通过一个servlet向mysql数据库中的blob列插入一个图像。 我是通过JSP文件中的“HTML文件输入类型”选择图像的,因此选择了图像的完整路径

我得到的错误是:

HTTP Status 500 - Desert.jpg (The system cannot find the file specified)

type Exception report

message Desert.jpg (The system cannot find the file specified)

description The server encountered an internal error (Desert.jpg (The system cannot find the file specified)) that prevented it from fulfilling this request.

exception

    java.io.FileNotFoundException: Desert.jpg (The system cannot find the file specified)
        java.io.FileInputStream.open(Native Method)
        java.io.FileInputStream.<init>(Unknown Source)
        Image.ImgInsert.doGet(ImgInsert.java:51)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.28 logs.
Apache Tomcat/7.0.28

谁能帮我一下吗?

这里至少有两个严重的概念错误

  • 您似乎认为拥有客户端本地磁盘文件系统路径就足以在服务器端获取整个文件内容。这是不可能的,因为客户端和服务器不共享同一个磁盘文件系统(除非它们碰巧在同一台计算机上运行,而这在现实世界中当然不会发生)

  • 您依赖于
    java.io
    中的相对路径。它与所谓的“当前工作目录”相对,即在Web服务器启动时打开的文件夹。这绝对不是Web应用程序直接所在的文件夹。例如
    C:\path\to\tomcat\bin
    。上传的文件肯定不会神奇地放在那里

  • 至于为什么它能在你的“朋友”的机器上工作,这无疑是因为他使用的Internet Explorer存在安全漏洞,其中完整的文件路径而不仅仅是文件名被作为请求参数发送到
    字段,而没有
    enctype=“multipart/form data”
    。同样,正如所回答的,这种方法在实际的生产环境中肯定不起作用

    你的具体问题可以通过仔细阅读以下答案来理解和解决


      • 这里至少有两个严重的概念错误

      • 您似乎认为拥有客户端本地磁盘文件系统路径就足以在服务器端获取整个文件内容。这是不可能的,因为客户端和服务器不共享同一个磁盘文件系统(除非它们碰巧在同一台计算机上运行,而这在现实世界中当然不会发生)

      • 您依赖于
        java.io
        中的相对路径。它与所谓的“当前工作目录”相对,即在Web服务器启动时打开的文件夹。这绝对不是Web应用程序直接所在的文件夹。例如
        C:\path\to\tomcat\bin
        。上传的文件肯定不会神奇地放在那里

      • 至于为什么它能在你的“朋友”的机器上工作,这无疑是因为他使用的Internet Explorer存在安全漏洞,其中完整的文件路径而不仅仅是文件名被作为请求参数发送到
        字段,而没有
        enctype=“multipart/form data”
        。同样,正如所回答的,这种方法在实际的生产环境中肯定不起作用

        你的具体问题可以通过仔细阅读以下答案来理解和解决


        我强烈怀疑程序映像路径中的某些地方是硬编码的。感谢Nambari花时间回答。但正如我上面提到的,在我朋友的计算机上,同样的程序没有任何改动。试着将
        fis
        写入一个新文件,看看它是否被创建…@alfasin:我强烈建议你也阅读答案,因为你似乎根本不理解这个问题。@BalusC我正在考虑你在#2(相对路径)中提到的同一个问题。我得承认我没有想到你提到的其他事情。对于@KaR,顺便说一句,该文件必须与您的
        JSP
        文件位于同一文件夹中-而不是任何其他桌面/根文件夹中。我强烈怀疑程序映像路径中的某些位置是硬编码的。感谢Nambari花时间回答。但正如我上面提到的,在我朋友的计算机上,同样的程序没有任何改动。试着将
        fis
        写入一个新文件,看看它是否被创建…@alfasin:我强烈建议你也阅读答案,因为你似乎根本不理解这个问题。@BalusC我正在考虑你在#2(相对路径)中提到的同一个问题。我得承认我没有想到你提到的其他事情。对于@KaR,顺便说一句,该文件必须与您的
        JSP
        文件位于同一文件夹中,而不是位于任何其他桌面/根文件夹中。非常感谢,但我已尝试从应用程序所在的同一目录插入图像。结果是一样的。我在没有EclipseIDE和它的情况下尝试了整个过程。错误总是一样的。我一直无法回答自己的问题是,为什么在另一台机器上,它可以从硬盘上的任何位置选择图像。换句话说,你根本不理解具体的问题。只要你不理解一个问题,解决它将是一个漫长而艰难的过程。停止粗鲁地叫喊,仔细阅读提供的三个链接(第一个和第二个链接应该解释为什么失败,第三个链接显示如何正确地进行)。嗯。。。非常感谢你的回答。我将尝试您提到的所有内容,如果遇到任何问题,请返回。非常感谢,但我已尝试从应用程序所在的同一目录插入图像。结果是一样的。我在没有EclipseIDE和它的情况下尝试了整个过程。错误总是一样的。我一直无法回答自己的问题是,为什么在另一台机器上,它可以从硬盘上的任何位置选择图像。换句话说,你根本不理解具体的问题。只要你不理解一个问题,解决它就会很困难
            String s_id = request.getParameter("myid");
            int id = Integer.parseInt(s_id);
            //IMAGE ACQUIRED FROM THE FROM THE JSP PAGE
            String img = request.getParameter("myimg");
        
            File f = new File(img);
            FileInputStream fis = new FileInputStream(f);
        
            String query="insert into images.imageinsert(id,image) values(?,?)";
            try
            {
                PreparedStatement pStatement = conn.prepareStatement(query);
        
                pStatement.setInt(1, id);
                pStatement.setBinaryStream(2, fis);
                int result = pStatement.executeUpdate();
        
                if(result != 0)
                {
                    response.sendRedirect("ImageHome.html");
                }
                pStatement.close();