基于Java+JSP+Servlet+MySQL实现文件上传MySQL数据库
数据库表的设计
USE picture;
CREATE TABLE imgs(
id int(11) NOT NULL AUTO_INCREMENT,
img longblob NOT NULL ,
PRIMARY KEY (id)
)DEFAULT CHARSET=utf8;
图片在数据库中无法显示,给定id检查是否上传成功。其中longblob可支持最大4GB的二进制数据。
上传页面设计
index.jsp:
<%request.setCharacterEncoding("UTF-8");%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>File Upload to Database Demo</title>
</head>
<style>
td{
width: 200px;
background-color: aquamarine;
text-align: center;
}
</style>
<body>
<center>
<h1>上传文件到数据库</h1>
<form method="post" action="imgServlet" enctype="multipart/form-data">
<table border="1" bgcolor="aqua">
<tr>
<td>选择图片: </td>
<td><input type="file" name="Photo" size="50"/></td>
</tr>
<tr>
<td>
<input type="submit" value="上传">
</td>
<td>
<input type="reset" value="取消">
</td>
</tr>
</table>
</form>
</center>
</body>
</html>
利用表单提交到后台Servlet,注意一定要加enctype=“multipart/form-data”,表示已二进制数据提交。
Servlet设计
UploadServlet.java
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.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@WebServlet("/imgServlet")
@MultipartConfig(maxFileSize = 1073741824)//最大1GB
public class UploadServlet extends HttpServlet {
//数据库的连接信息
private String url="jdbc:mysql://localhost:3306/picture";
private String user="root";
private String password="123456";
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
FileInputStream fileInputStream=null;//文件输入流
Connection connection=null;
Part part=request.getPart("Photo");//获取表单提交的文件
if (part!=null){
//验证是否接受到文件
System.out.println("文件已经提交到Servlet");
System.out.println("文件名称:"+part.getName());
System.out.println("文件大小:"+part.getSize());
System.out.println("文件类型:"+part.getContentType());
//将文件转换到输入流
fileInputStream= (FileInputStream) part.getInputStream();
}
String checkMessage="文件准备开始上传";//检查文件状态
try {
//连接数据库
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
connection=DriverManager.getConnection(url,user,password);
//上传文件到数据库
String sql="insert into imgs(img) values(?)";
PreparedStatement preparedStatement=connection.prepareStatement(sql);
preparedStatement.setBinaryStream(1,fileInputStream,fileInputStream.available());
int row=preparedStatement.executeUpdate();
if (row>0){
checkMessage="文件已成功上传数据库";
}else {
checkMessage="文件上传失败";
}
}catch (SQLException sqle){
System.out.println("驱动加载失败");
sqle.getStackTrace();
}finally {
if (connection!=null){
try {
connection.close();
}catch (SQLException s){
s.getStackTrace();
}
}else {
System.out.println("数据库连接失败");
}
request.setAttribute("CheckMessage",checkMessage);
getServletContext().getRequestDispatcher("/Check.jsp").forward(request,response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
检验上传是否成功界面设计
CheckMessage.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<center>
<h3>${CheckMessage}</h3> <br>
<h4><a href="index.jsp">继续上传</a></h4>
</center>
</body>
</html>
最终效果