java servlet獲取上傳圖片以二進制保存到MySQL中,讀取Mysql保存的二進制圖片

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

這裏寫圖片描述

上傳頁面

這裏寫圖片描述

上傳成功頁面

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章