因为设计的需要,将图片保存到数据库中(很不推荐这样做,这样会消耗数据库的磁盘io和网络带宽)
需要完成的部分如下
- 图片上传的html页面
- 处理上传图片保存到数据库模块
- 上传成功取得数据库中的图片模块
图片上传的html页面:Image.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>上传图片</title>
<meta charset="utf-8"/>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="row">
<div class="col-md-4"></div>
<div class="col-md-4" style="margin-top: 15%;">
<form class="form-horizontal" method="post" action="servlet/ImageUpload" enctype="multipart/form-data" >
<div class="form-group">
<div class="col-sm-10">
<input type="file" class="form-control" name="fileName" placeholder="上传图片">
</div>
<button class="btn btn-default" type="submit">上传</button>
</div>
</form>
</div>
<div class="col-md-4"></div>
</div>
</body>
</html>
处理上传图片保存到数据库模块servlet:ImageUpload.java
package image;
import java.io.IOException;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import config.LocalMysql;
@SuppressWarnings("serial")
public class ImageUpload extends HttpServlet {
/**
* 获取上传文件
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置读取上传文件文件的缓存
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(factory);
sfu.setHeaderEncoding("UTF-8");//设置字符
sfu.setSizeMax(10*1024*1024);//上传文件最大10m
Connection con=null;
try {
con=new LocalMysql().getcon();
List<FileItem> items = sfu.parseRequest(request);//获取上传的文件名
System.out.println(items.size());
PreparedStatement pre=null;
String sql="INSERT INTO `image`(name,data) VALUE(?,?)";
for(FileItem fileItem:items){//将上传的所有文件保存到mysql数据库
String name = fileItem.getName();// name属性值
System.out.println(name);
pre=con.prepareStatement(sql);
pre.setString(1, name);
pre.setBlob(2, fileItem.getInputStream());
pre.executeUpdate();
pre.close();
response.sendRedirect("http://yuyuan:8080/zzz/servlet/GetImage?data="+URLEncoder.encode(name, "UTF-8"));//上传成功跳转到测试页面
}
} catch (Exception e) {
response.sendRedirect("http://yuyuan:8080/zzz/Image.jsp?data="+e.getMessage());//失败携带异常信息返回上传页面
e.printStackTrace();
}finally{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
上传成功取得数据库中的图片模块servlet:GetImage.java
package image;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLDecoder;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import config.LocalMysql;
@SuppressWarnings("serial")
public class GetImage extends HttpServlet {
/**
* 根据传入的图片名称获取数据库中的图片
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data=URLDecoder.decode(request.getParameter("data"), "UTF-8");//获取传过来的文件名
System.out.println(data);
Connection con=null;
String sql="SELECT DATA FROM`image` WHERE NAME= ?";
try{
con=new LocalMysql().getcon();
PreparedStatement pre=con.prepareStatement(sql);
pre.setString(1, data);
ResultSet re=pre.executeQuery();
if(re.next()){
Blob b=re.getBlob(1);
response.setContentType("image/jpeg"); //设置返回的类型
OutputStream out = response.getOutputStream();
out.write(b.getBytes(1, (int) b.length()));//获取读取的数据写到返回中
out.flush();
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
附加:获取本地数据库工具:LacalMysql.java
package config;
import java.sql.Connection;
import java.sql.DriverManager;
public class LocalMysql {
/**
* 获取本地数据库连接
*/
public Connection getcon() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8", "root", "root");
return conn;
}
}
数据库测试表:image
CREATE TABLE `image` (
`name` varchar(100) NOT NULL,
`data` longblob NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8