因爲設計的需要,將圖片保存到數據庫中(很不推薦這樣做,這樣會消耗數據庫的磁盤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