Java 如何使用Servlet将文件上传到数据库中?

Java 如何使用Servlet将文件上传到数据库中?,java,tomcat,servlets,file-upload,Java,Tomcat,Servlets,File Upload,我需要使用servlet处理文件上载,如下所示: package com.limrasoft.image.servlets; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.sql.*; @WebServlet(name="serv1",value="/s1"

我需要使用servlet处理文件上载,如下所示:

 package com.limrasoft.image.servlets;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.sql.*;

    @WebServlet(name="serv1",value="/s1")
    public class Account extends HttpServlet{
        public void doPost(HttpServletRequest req,HttpServletResponse res)throws 
        ServletException,IOException{
            try{
                Class.forName("oracle.jdbc.driver.OracleDriver");
                Connecection con=null;
                try{
                    con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","sajid");
                    PrintWriter pw=res.getWriter();
                    res.setContentType("text/html");
                    String s1=req.getParameter("un");
                    string s2=req.getParameter("pwd");
                    String s3=req.getParameter("g");
                    String s4=req.getParameter("uf");
                    PreparedStatement ps=con.prepareStatement("insert into account(?,?,?,?)");
                    ps.setString(1,s1);
                    ps.setString(2,s2);
                    ps.setString(3,s3);
                    File file=new File("+s4+");
                    FileInputStream fis=new FileInputStream(fis);
                    int len=(int)file.length();
                    ps.setBinaryStream(4,fis,len);
                    int c=ps.executeUpdate();
                    if(c==0){pw.println("<h1>Registratin fail");}
                    else{pw.println("<h1>Registration fail");}
                }
                finally{if(con!=null)con.close();}
            }
            catch(ClassNotFoundException ce){pw.println("<h1>Registration Fail");}
            catch(SQLException se){pw.println("<h1>Registration Fail");}
            pw.flush();
            pw.close();
        }
    }
package com.limrasoft.image.servlets;
导入java.io.*;
导入javax.servlet.*;
导入javax.servlet.http.*;
导入javax.servlet.annotation.*;
导入java.sql.*;
@WebServlet(name=“serv1”,value=“/s1”)
公共类帐户扩展HttpServlet{
public void doPost(HttpServletRequest-req、HttpServletResponse-res)抛出
ServletException,IOException{
试一试{
类forName(“oracle.jdbc.driver.OracleDriver”);
connection con=null;
试一试{
con=DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:xe”、“system”、“sajid”);
PrintWriter pw=res.getWriter();
res.setContentType(“文本/html”);
字符串s1=req.getParameter(“un”);
字符串s2=req.getParameter(“pwd”);
字符串s3=req.getParameter(“g”);
字符串s4=req.getParameter(“uf”);
准备好的报表ps=con.准备好的报表(“插入账户(?,?,?)”;
ps.setString(1,s1);
ps.setString(2,s2);
ps.setString(3,s3);
文件文件=新文件(“+s4+”);
FileInputStream fis=新的FileInputStream(fis);
int len=(int)file.length();
ps.setBinaryStream(4,fis,len);
int c=ps.executeUpdate();
如果(c==0){pw.println(“注册失败”);}
else{pw.println(“注册失败”);}
}
最后{if(con!=null)con.close();}
}
catch(ClassNotFoundException ce){pw.println(“注册失败”);}
catch(SQLException se){pw.println(“注册失败”);}
pw.flush();
关闭();
}
}
但它会导致一个错误页面:

HTTP状态500-Servlet3.java(系统找不到指定的文件)

这是如何造成的,我如何解决它?

您似乎无法从HTTP请求中提取上载的文件内容。您只需收集文件名称,并在相对于服务器当前工作目录的路径上围绕它构建一个
新文件()
。我不确定您在编写此代码时是怎么想的,但当webbrowser在与webserver不同的物理机器上运行时,仅仅传递文件名是行不通的,因为它们不会共享同一个本地磁盘文件系统

相反,您应该在请求中传递整个文件内容。您可以通过在HTML表单上使用
多部分/表单数据
编码来实现这一点


现在,用注释servlet以启用
multipart/formdata
支持

@WebServlet("/s1")
@MultipartConfig
public class Account extends HttpServlet {
然后,要提取上传的文件,只需使用

文件内容以
InputStream
的形式由提供。下面的代码

String s4=req.getParameter("uf");
// ...
File file=new File("+s4+");
FileInputStream fis=new FileInputStream(fis);
int len=(int)file.length();
ps.setBinaryStream(4,fis,len);
应该由

Part s4 = req.getPart("uf");
// ...
ps.setBinaryStream(4, s4.getInputStream());
另见:

你应该为你的问题添加更多的细节——仅仅一段代码本身是无法回答的。此外,状态代码505和标题中的错误消息“未找到文件”是矛盾的。状态代码505代表错误消息“HTTP版本不受支持”(这是一个非常非常罕见的错误,顺便说一句),并且错误消息“未找到文件”实际上与状态代码404相关联。另请参见浏览器HTTP Status 500-Servlet3.java中的这是我的错误(系统找不到指定的文件)
Part s4 = req.getPart("uf");
// ...
ps.setBinaryStream(4, s4.getInputStream());