最近写了一个文件上传的jsp,但是在电脑上使用ip地址加端口号访问此jsp界面,可以访问得到但是就是不能够上传文件到指定的服务器Mysql数据库。在服务器使用本机ip就能够访问且能够上传文件。我把这两种上传的方法对比了一下,发现问题出现在文件的路径上。当在电脑上使用ip访问时,上传文件后,服务器只收到了此文件的名称,仅仅是名称,并没有该文件的绝对路径,所以它抛出了此文件找到异常。但是在服务器本地上传文件则不会出现这个问题,数据库能够得到文件的绝对路径。找到了问题的所在,此刻确实让我欣喜若狂。但是得怎么解决这个问题了,我查看了相关资料,他们绝大多数都是使用某某框架,某某apache插件。但是我试着去用这些插件时发现还是不能解决这个问题,还是出现以前的老毛病。顿时我就无语了,,,,,,
思索了两天我想换一种思路试试,看可不可以这样,我先把文件上传到服务器本地磁盘,然后再让数据库在本地磁盘找到该文件的真实路径再上传。通过我的调试,确实可以这样。我发现把文件上传到指定的服务器磁盘不管是在该服务器通过Localhost上传还是在自己电脑上通过ip地址访问上传都可以实现上传。mysql数据库不能够上传文件的原因是没有找到该文件(其实是没有找到该文件的绝对路径,当然找不到该文件了)所以我先把文件上传到服务器电脑磁盘上,然而Mysql直接在本机上查找文件上传,这时是能够找到该文件的路径的。
这个是我写的文件上传servlet,用来接收表单的文件和文本然后把文件保存到服务器的本地,接着mysql访问该本地地址接着上传到mysql表里保存。当需要使用该照片时可以直接通过数据流的形式从mysql中读出来显示到指定的jsp上,下面是我的代码:
package com.info;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.util.* ;
import java.sql.*;
import java.io.*;
@WebServlet("/FileUploadServlet")
@MultipartConfig(location="C:\\",fileSizeThreshold=1024)
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setCharacterEncoding("gb2312");
String mnumber = request.getParameter("mnumber");
Part p = request.getPart("fileName");//得到文件名字,这个是真正的全名。包含了文件头,格式之类的。不是路径名字
String h = p.getHeader("content-disposition");
String fname = h.substring(38, h.length()-1);//得到文件的路径和名字
String message = " ";
if(p.getSize()>1024*1024*10)
{
p.delete();
message = "fail";
}
else{
String path = "C:\\mysqlphoto\\";//先上传到服务器上磁盘的c盘mysqlphoto目录下
p.write(path+"\\"+fname);//把文件写入该目录
fname = path+fname;//重新定义文件的觉对路径
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try{
Class.forName("com.mysql.jdbc.Driver");
String dbUrl = "jdbc:mysql://localhost:3306/cricket?useUnicode=true&characterEncoding=GB2312";
String dbUser = "root";
String dbPsw = "1195726908";
con = DriverManager.getConnection(dbUrl,dbUser, dbPsw);
FileInputStream str = new FileInputStream(fname);//通过该路径找到文件,把文件转换为流的形式上传到数据库
String sql = "insert into imageinfo values(?,?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, mnumber);//上传表单传过来的文本文件
pstmt.setBinaryStream(2, str,str.available());//上传本地上c盘的数据流文件
pstmt.execute();
String flag = "success";
con.close();
pstmt.close();//上传成功后关闭连接,方便后续再连接。
if(flag!=null)
{
request.getRequestDispatcher("showphoto2.jsp").forward(request, response);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}