【问题标题】:How to upload a file into database by using Servlet?如何使用 Servlet 将文件上传到数据库?
【发布时间】:2012-10-23 06:13:03
【问题描述】:

我需要使用 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();
        }
    }

但是会导致错误页面:

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

这是怎么引起的,我该如何解决?

【问题讨论】:

  • 您应该为您的问题添加更多细节 - 仅靠一小段代码几乎是无法回答的。
  • 另外,您的标题中的状态码 505 和错误消息“找不到文件”是矛盾的。状态码 505 代表错误消息“不支持 HTTP 版本”(顺便说一句,这是一个非常非常罕见的错误),错误消息“找不到文件”实际上与状态码 404 相关。另见w3.org/Protocols/rfc2616/rfc2616-sec10.html跨度>
  • 这是我在浏览器 HTTP 状态 500 - Servlet3.java 中的错误(系统找不到指定的文件)

标签: java tomcat servlets file-upload


【解决方案1】:

您似乎无处从 HTTP 请求中提取上传的文件 content。您只是收集文件 name 并在相对于服务器当前工作目录的路径上围绕它构建一个new File()。我不确定您在编写此代码时在想什么,但是当 webbrowser 在物理上与 web 服务器不同的机器上运行时,仅仅传递文件名永远不会起作用,因为它们不会共享相同的本地磁盘文件系统。

相反,您应该在请求中传递整个文件内容。您可以通过在 HTML 表单上使用multipart/form-data 编码来实现此目的。

<form action="s1" method="post" enctype="multipart/form-data">

现在,使用 @MultipartConfig 注释 servlet 以启用 multipart/form-data 支持。

@WebServlet("/s1")
@MultipartConfig
public class Account extends HttpServlet {

然后,要提取上传的文件,只需使用HttpServletRequest#getPart()。

Part s4 = req.getPart("uf");

文件内容为InputStream,由Part#getInputStream() 提供。所以,总而言之,下面的代码

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());

另见:

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多