如何使用jdbc、servlet和html将文件远程上传到mysql数据库

ehxuflar  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(363)

我´我一直试图将一个文件从一个html页面远程上传到一个servlet,然后保存到一个数据库中,到目前为止,我已经设法在本地完成了这项工作,但是当使用同一网络中的另一台计算机时,我得到了一个错误的解释,说明系统找不到指定的文件。
我使用以下表格接收文件:

<form method="post" action="UploadFile" enctype="multipart/form-data">                    
       <tr>
          <td><Input name="name" type="text"></td>
          <td><Input name="client_ID" type="text" required></td>
          <td><input name="date" type="date"></td>
          <td><input name="pdf" type="file"></td>
          <td><input name="xml" type="file"></td>
      </tr>
      </form>

链接到servlet中的以下操作:

String url = "jdbc:mysql://localhost/database";
    Connection con;
    String path1=request.getParameter("pdf");
    String path2=request.getParameter("xml");
    String name=request.getParameter("name");
    String date=request.getParameter("date");
    String client=request.getParameter("client_ID");
    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection(url,"user", "password");
    PreparedStatement stat = con.prepareStatement("insert into table(pdf, xml, date, client, employee_ID, client_ID) values(?,?,?,?,1,?)");
    InputStream is = new FileInputStream(new File(path1));
    stat.setBlob(1,is);
    InputStream is2 = new FileInputStream(new File(path2));
    stat.setBlob(2,is2);
    stat.setString(3,date);
    stat.setString(4,name);
    stat.setString(5,client);

并引发以下异常:

java.io.FileNotFoundException: file.pdf (The system could not find the specified file)

我知道问题来自servlet试图从主机上传文件。任何帮助都将不胜感激。

e4yzc0pl

e4yzc0pl1#

您正在从请求中读取文件名,但是当文件内容实际上在请求中时,您正在尝试从磁盘中读取文件内容。
尝试以下方法开始:

String url = "jdbc:mysql://localhost/database";
Connection con;
String name=request.getParameter("name");
String date=request.getParameter("date");
String client=request.getParameter("client_ID");
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url,"user", "password");
PreparedStatement stat = con.prepareStatement("insert into table(pdf, xml, date, client, employee_ID, client_ID) values(?,?,?,?,1,?)");

javax.servlet.http.Part pdf = request.getPart("pdf"); // <-- get multipart part from request
InputStream is = pdf.getInputStream();                // <-- get input stream from multipart part
javax.servlet.http.Part xml = request.getPart("xml"); // <-- get multipart part from request
InputStream is2 = xml.getInputStream();                // <-- get input stream from multipart part

stat.setBlob(1,is);
stat.setBlob(2,is2);
stat.setString(3,date);
stat.setString(4,name);
stat.setString(5,client);

现在。。。你的代码还有很多其他的问题,这些问题应该在以后的工作中解决。没有特定顺序,它们是:
验证您得到的所有输入,以确保它们是正常的。我可以把2GB的文件上传到你的数据库吗?如果一个扩展名为pdf的文件实际上是xml文件呢?反面呢?如果您希望pdf文件是pdf,而xml文件是xml,那么最好检查以确保客户端发送的是xml。不要在你的数据库中插入任何你没有检查过的东西,以确保它的合法性和适当性。
使用jdbc连接池。别再打电话了 Class.forName() 以及 DriverManager.getConnection() 每一个请求。
将代码重新划分为不同的部分:一部分用于从请求中获取数据,另一部分用于将数据写入数据库。没有充分的理由从同一段代码执行http和jdbc活动。这是什么,php?
资源管理:确保所有可关闭的资源都使用 try/catch/finally 把所有东西都清理干净。这包括 Part 项目,应该有 delete() 方法在完成它们时调用。

7gyucuyw

7gyucuyw2#

这个问题是这个问题的重复。读取用java上传的文件的内容
您必须先将文件保存到本地硬盘。
将本地硬盘文件发送到mysql数据库。
读取流并将其保存到本地硬盘。

String path1=request.getParameter("pdf");
     //read this and save the content to local harddisk, location e.g. C:\\temp\\A.pdf
     String path2=request.getParameter("xml");
     //read this and save the content to local harddisk, location e.g. C:\\temp\\B.xml

现在,将本地路径传递给mysql query。

InputStream is = new FileInputStream(new File("C:\tmp\A.pdf"));
stat.setBlob(1,is);
InputStream is2 = new FileInputStream(new File("C:\tmp\B.xml"));
stat.setBlob(2,is2);

相关问题