java图片保存到数据库_java中将图片保存到数据库中

在实际的开发中,我们可能需要将图片、影音等文件直接保存到数据库中,然后通过编程方式将数据读出进行使用。例如将读出的图片数据显示出来,将读出的电影文件播放出来。

二进制数据直接保存到文件和从文件中读出非常的简单。和普通的数据库操作差别不大。只是用到部分流操作。例如各种输入输出流操作。所以深刻理解流操是非常重要的。

在此我借助于一个JSP的简单实例进行讲解。此实例保存职员数据,其中职员数据包含一个图片列。此列保存每名员工的照片。在此将照片直接保存到数据库中。首先建立职员信息表EmployeeInfo,表列非常的简单

employeeId:职员编号(自动增长);employeeName:职员姓名;age:职员年龄;pic:职员图片(image类型)

首先讲解信息的保存。先建立一个录入界面index.jsp,其中包含一个元素,用于让用户选择图片文件。

页面代码如下(不做过多讲解):

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP 'index.jsp' starting page
EmployeeName:
Age:
Image:

页面请求addServlet,获取录入信息,并调用JavaBean实现数据保存。Servlet代码如下:

package com.frank.action;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.frank.rule.*;

public class AddServlet extends HttpServlet {

/**

* Constructor of the object.

*/

public AddServlet() {

super();

}

/**

* Destruction of the servlet.

*/

public void destroy() {

super.destroy(); // Just puts "destroy" string in log

// Put your code here

}

/**

* The doGet method of the servlet.

*

* This method is called when a form has its tag value method equals to get.

*

* @param request the request send by the client to the server

* @param response the response send by the server to the client

* @throws ServletException if an error occurred

* @throws IOException if an error occurred

*/

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String employeeName=request.getParameter("employeeName");

int age=Integer.parseInt(request.getParameter("age"));

String pic=request.getParameter("pic");

EmployeeDAO employeeDAO=new EmployeeDAO();

if(employeeDAO.employeeAdd(employeeName, age, pic))

response.sendRedirect("success.jsp");

else

response.sendRedirect("index.jsp");

}

/**

* The doPost method of the servlet.

*

* This method is called when a form has its tag value method equals to post.

*

* @param request the request send by the client to the server

* @param response the response send by the server to the client

* @throws ServletException if an error occurred

* @throws IOException if an error occurred

*/

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

/**

* Initialization of the servlet.

*

* @throws ServletException if an error occurs

*/

public void init() throws ServletException {

// Put your code here

}

}

此Servlet只是简单的获取页面输入的数据,其中获取的Pic为用户选择的图片路径。严格讲,获取文件需要经过验证,防止非法图片的选择,这个可以根据自己的需要改善。然后Servlet调用业务类,将获取的数据通过参数传入,进行数据的增加。其中employeeAdd方法实现数据的保存,代码如下:

public boolean employeeAdd(String employeeName,int age,String pic){

Connection conn=null;

PreparedStatement pstmt=null;

FileInputStream fis=null;

try{

Class.forName("net.sourceforge.jtds.jdbc.Driver");

conn=DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/SampleDB","sa","");

fis=new FileInputStream(pic);

String strSQL="INSERT INTO employeeInfo VALUES(?,?,?)";

pstmt=conn.prepareStatement(strSQL);

pstmt.setString(1, employeeName);

pstmt.setInt(2, age);

pstmt.setBinaryStream(3, fis, fis.available());

if(pstmt.executeUpdate()>0)

return true;

else

return false;

}catch(ClassNotFoundException ex){

ex.printStackTrace();

return false;

}catch(SQLException ex){

ex.printStackTrace();

return false;

}catch(IOException ex){

ex.printStackTrace();

return false;

}finally{

try{

fis.close();

pstmt.close();

conn.close();

}catch(Exception ex){

}

}

}

注意粗体部分,用获取的pic信息(文件路径)创建文件输入流对象,增加pic字段的内容通过流对象增加。

pstmt.setBinaryStream(3, fis, fis.available());

三个参数分别为:参数索引,流对象,流对象大小

当增加成功时,重定向到success.jsp

那么如何验证图片数据是否保存到了数据库中呢?我们通过再次检索增加的数据,读出增加的图片数据并在页面中显示出来进行验证。

首先建立一个非常简单的页面search.jsp,此页面通过文本框使用户输入要检索的人员的姓名,检索人员的基本信息(不检索图片数据),将检索的人员数据形成JOPO对象,保存到session中,以便页面使用。

JOPO类(EmployeeObj)

package com.frank.obj;

public class EmployeeObj {

private int employeeId;

private String employeeName;

private int age;

public int getEmployeeId() {

return employeeId;

}

public void setEmployeeId(int employeeId) {

this.employeeId = employeeId;

}

public String getEmployeeName() {

return employeeName;

}

public void setEmployeeName(String employeeName) {

this.employeeName = employeeName;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

search.jsp页面代码如下:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP 'search.jsp' starting page

employeeName:

通过searchServlet实现基本信息的检索

package com.frank.action;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import com.frank.obj.EmployeeObj;

import com.frank.rule.EmployeeDAO;

public class SearchServlet extends HttpServlet {

/**

* Constructor of the object.

*/

public SearchServlet() {

super();

}

/**

* Destruction of the servlet.

*/

public void destroy() {

super.destroy(); // Just puts "destroy" string in log

// Put your code here

}

/**

* The doGet method of the servlet.

*

* This method is called when a form has its tag value method equals to get.

*

* @param request the request send by the client to the server

* @param response the response send by the server to the client

* @throws ServletException if an error occurred

* @throws IOException if an error occurred

*/

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String employeeName=request.getParameter("employeeName");

EmployeeDAO employeeDAO=new EmployeeDAO();

EmployeeObj employeeObj=employeeDAO.getEmployeeByName(employeeName);

HttpSession session=request.getSession();

session.setAttribute("employee", employeeObj);

response.sendRedirect("display.jsp");

}

/**

* The doPost method of the servlet.

*

* This method is called when a form has its tag value method equals to post.

*

* @param request the request send by the client to the server

* @param response the response send by the server to the client

* @throws ServletException if an error occurred

* @throws IOException if an error occurred

*/

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request,response);

}

/**

* Initialization of the servlet.

*

* @throws ServletException if an error occurs

*/

public void init() throws ServletException {

// Put your code here

}

}

此Servlet调用业务类的getEmployeeByName方法检索人员基本信息,返回EmployeeObj对象,并放入session中,当然也可以放入request中,根据自己的需要改进。页面检索成功后重定向到display.jsp进行信息的显示(稍后讲解)

getEmployeeByName方法代码如下:

public EmployeeObj getEmployeeByName(String employeeName){

Connection conn=null;

PreparedStatement pstmt=null;

ResultSet rst=null;

EmployeeObj employeeObj=new EmployeeObj();

try{

Class.forName("net.sourceforge.jtds.jdbc.Driver");

conn=DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/SampleDB","sa","");

String strSQL="SELECT employeeId,employeeName,age FROM EmployeeInfo WHERE employeeName=?";

pstmt=conn.prepareStatement(strSQL);

pstmt.setString(1, employeeName);

rst=pstmt.executeQuery();

if(rst.next()){

employeeObj.setEmployeeId(rst.getInt("employeeId"));

employeeObj.setEmployeeName(rst.getString("employeeName"));

employeeObj.setAge(rst.getInt("age"));

return employeeObj;

}

return null;

}catch(ClassNotFoundException ex){

ex.printStackTrace();

return null;

}catch(SQLException ex){

ex.printStackTrace();

return null;

}finally{

try{

pstmt.close();

conn.close();

}catch(Exception ex){

}

}

}

display.jsp负责显示查询出的结果信息,代码如下:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP 'display.jsp' starting page

EmployeeObj employeeObj=(EmployeeObj)session.getAttribute("employee");

%>

EmployeeId
EmployeeName
Age
PicdisplayServlet?employeeId=<%=employeeObj.getEmployeeId()%20%>

代码非常的简单,只是简单的从session中获取保存的EmployeeObj对象,然后利用jsp表达式将数据成员信息显示到页面上。但是注意粗体部分,因为我们需要将保存的图片数据读出,然后显示成图片。所以在此我们利用Img元素显示图片,而Src利用displayServlet的运行结果输出到客户端,作为图片的显示源。displayServlet包含参数employeeId,用来决定具体显示哪一员工的图片。

displayServlet通过Servlet输出流,将读取的图片数据发送到客户端,代码如下:

package com.frank.action;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.InputStream;

import java.io.PrintWriter;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.frank.rule.EmployeeDAO;

public class DisplayServlet extends HttpServlet {

/**

* Constructor of the object.

*/

public DisplayServlet() {

super();

}

/**

* Destruction of the servlet.

*/

public void destroy() {

super.destroy(); // Just puts "destroy" string in log

// Put your code here

}

/**

* The doGet method of the servlet.

*

* This method is called when a form has its tag value method equals to get.

*

* @param request the request send by the client to the server

* @param response the response send by the server to the client

* @throws ServletException if an error occurred

* @throws IOException if an error occurred

*/

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("image/gif");

int employeeId=Integer.parseInt(request.getParameter("employeeId"));

EmployeeDAO employeeDAO=new EmployeeDAO();

InputStream is=employeeDAO.getPicById(employeeId);

int size=is.available();

byte[] image=new byte[size];

is.read(image);

ServletOutputStream out=response.getOutputStream();

out.write(image);

}

/**

* Initialization of the servlet.

*

* @throws ServletException if an error occurs

*/

public void init() throws ServletException {

// Put your code here

}

}

在此,调用业务类的getPicById方法得到图片数据的输入流。然后获取的输入流写到ServletOutputStream,这样可以在Servlet的输出端使用,即img的src中使用

getPicById代码如下:

public InputStream getPicById(int employeeId){

Connection conn=null;

PreparedStatement pstmt=null;

ResultSet rst=null;

InputStream is=null;

try{

Class.forName("net.sourceforge.jtds.jdbc.Driver");

conn=DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/SampleDB","sa","");

String strSQL="SELECT pic FROM EmployeeInfo WHERE employeeId=?";

pstmt=conn.prepareStatement(strSQL);

pstmt.setInt(1, employeeId);

rst=pstmt.executeQuery();

if(rst.next()){

is=rst.getBinaryStream("pic");

return is;

}

return null;

}catch(ClassNotFoundException ex){

ex.printStackTrace();

return null;

}catch(SQLException ex){

ex.printStackTrace();

return null;

}finally{

try{

pstmt.close();

conn.close();

}catch(Exception ex){

}

}

}

注意粗体部分

好了,我们可以通过运行结果来进行验证,假设我们搜索名称为Mike的人员数据,那么这样:

点search按钮,运行结果如下:

好了,显示出了检索结果,不但包括人员的基本数据,保存到数据库中的图片数据也被读出并显示成图片。

代码只是利用jsp简单的进行体现,大家可以根据自己的需要进行改进

---很抱歉截图不可以在这个上面显示 ----

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值