我需要使用 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 Status 500 - Servlet3.java (The system cannot find the file specified)
这是怎么引起的,我该如何解决?
最佳答案
您似乎无处从 HTTP 请求中提取上传的文件内容。您只是收集文件 name 并在相对于服务器当前工作目录的路径上围绕它构建一个 new File()
。我不确定您在编写这段代码时在想什么,但是当网络浏览器在与网络服务器物理上不同的机器上运行时,仅仅传递文件名是行不通的,因为它们不会共享相同的本地磁盘文件系统。
相反,您应该在请求中传递整个文件内容。您可以通过对 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());
另见:
关于java - 如何使用 Servlet 将文件上传到数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13024473/