`
My*Love
  • 浏览: 72184 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

图片以二进制保存到Oracle,取出并显示到页面示例

阅读更多
  用过数据库的人都知道,像文件、图片、视频等这些大对象可以用两种方式来存取:1.将这些对象放到服务器的某个文件中,将它们的路径保存到数据库;2.直接将这些文件对象以二进制形式保存到数据库中,用时再通过流对象读取出来。
  可能大多数人采用第一种方式,这里我主要试下第二种方式保存数据,原理主要是通过Oracle里面的BLOB数据类型来实现。
  这个示例主要是将页面的学生信息录入数据库,然后点击查看按钮马上可以查看当前保存用户的资料,实现截图如下:

 








  新建一张学生表,字段如下:



  Student类
 
/**
 * 学生类
 * 
 */
public class Student {
	private int id;
	private String sex;
	private String username;
	private String picName;

	public String getPicName() {
		return picName;
	}

	public void setPicName(String picName) {
		this.picName = picName;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String toString() {
		return "id: " + id + " username: " + username + " sex: " + sex;
	}
}
  

 
  Oracle数据库连接
 
/**
 * 与Oracle数据库连接
 * 
 */
public class OracleConnection {
	private static String ojdbcURL = "jdbc:oracle:thin:@localhost:1521:xe";
	private static String ojdbcDriver = "oracle.jdbc.driver.OracleDriver";
	private static String userName = "czc";
	private static String password = "netjava";
	private static Connection connec;

	public static Connection getConnec() {
		if (connec != null) {
			return connec;
		}
		try {
			Class.forName(ojdbcDriver);
			connec = DriverManager.getConnection(ojdbcURL, userName,     password);
			System.out.println("与oracle数据库连接成功...");
		} catch (Exception e) {
			System.out.println("与oracle数据库连接失败...");
			e.printStackTrace();
		}
		return connec;
	}
}
  


  Student操作类
 
/**
 * 数据操作
 */
public class StudentDAO {

	/**
	 * 将学生信息保存到数据库
	 * 
	 * @param stu:学生对象
	 * @return :是否成功
	 */
	public boolean savaStuMsg(Student stu) {
		try {
			// 取得数据库连接对象
			Connection connec = OracleConnection.getConnec();
			// 写插入SQL
			String sql = "insert into student(name,sex,picture) values(?,?,?)";
			// 得到预编译对象
			PreparedStatement pstm = connec.prepareStatement(sql);
			pstm.setString(1, stu.getUsername());
			pstm.setString(2, stu.getSex());
			// 创建一个文件输入流对象
			FileInputStream fins = new FileInputStream(stu.getPicName());
			// 将图片以二制数据保存到数据库
			pstm.setBinaryStream(3, fins, fins.available());
			pstm.addBatch();
			pstm.executeBatch();
			System.out.println("学生信息保存成功!");
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 根据学生名字查询学生信息
	 * 
	 * @param username:姓名
	 * @return
	 */
	public Student getStuMsg(String username) {
		try {
			Connection connec = OracleConnection.getConnec();
			// 注:where后varchar字段必须加''
			String sql = "select id,sex from student where name='" + username
					+ "'";
			Statement stmt = connec.createStatement();
			ResultSet rset = stmt.executeQuery(sql);
			Student stu = new Student();
			if (rset.next()) {
				stu.setId(rset.getInt("id"));
				stu.setSex(rset.getString("sex"));
				stu.setUsername(username);
			}
			return stu;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 查找要显示图片
	 * 
	 * @param id:图片id
	 * @return:缓冲输入流
	 */
	public BufferedInputStream getPicMsg(int id) {
		// 定义一个BLOB对象,这是一种数据对象,关键是这个BLOB对象的作用
		BLOB blob = null;
		try {
			Connection connec = OracleConnection.getConnec();
			String sql = "select picture from student where id=" + id;
			Statement stmt = connec.createStatement();
			ResultSet rset = stmt.executeQuery(sql);
			if (rset.next()) {
				// 得到图片BLOB对象
				blob = (BLOB) rset.getBlob("picture");
			}
			// 得到图片输入流
			InputStream in = blob.getBinaryStream();
			// 包装成缓冲输入流
			BufferedInputStream bfin = new BufferedInputStream(in);
			return bfin;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
  


  SaveServlet:处理页面提交信息的Servlet类
 
/**
 * 将提交上来的数据保存到数据库
 *  
 */
public class SaveServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		String username = request.getParameter("username");
		String sex = request.getParameter("sex");
		String picture = request.getParameter("picture");
		System.out.println("username:" + username + " sex:" + sex + " picture:"
				+ picture);
		// 创建一个学生对象
		Student stu = new Student();
		stu.setUsername(username);
		stu.setSex(sex);
		stu.setPicName(picture);
		// 将学生信息保存到数据库
		StudentDAO sdao = new StudentDAO();
		boolean isSuccess = sdao.savaStuMsg(stu);
		if (isSuccess) {
			//将学生的名字放到request中
			request.setAttribute("username", username);
			request.getRequestDispatcher("/success.jsp").forward(request, response);
		}else{
			request.getRequestDispatcher("/error.jsp").forward(request, response);
		}
	}
}
  


SelectServlet:将保存的学生对象信息查询出来的Servlet
 
/**
 * 将保存的学生查找出来
 * 
 */
public class SelectServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		String username = request.getParameter("username");
		System.out.println("要查询的学生名字是: " + username);
		StudentDAO sdao = new StudentDAO();
		// 根据学生名字得到学生对象
		Student stu = sdao.getStuMsg(username);
		if (stu != null) {
			// 将对象放到session对象中
			request.getSession().setAttribute("stu", stu);
			request.getRequestDispatcher("/display.jsp").forward(request, response);
		}
	}
}
  


核心代码--DisplayServlet:显示图片的Servlet
 
/**
 * 处理显示图片的servlet:将图片显示到页面
 * 
 */
public class DisplayServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("image/jpg");
		// 从session对象中得到学生对象
		Student stu = (Student) request.getSession().getAttribute("stu");
		// 得到图片流对象
		StudentDAO sdao = new StudentDAO();
		BufferedInputStream bfin = sdao.getPicMsg(stu.getId());
		// 将ServletOutputStream包装成BufferedOutputStream
		BufferedOutputStream bout = new BufferedOutputStream(response
				.getOutputStream());
		int i = 0;
		while ((i = bfin.read()) != -1) {
			bout.write(i);
		}
		bfin.close();
		bout.flush();
		bout.close();
	}
}
  

 
  display.jsp:显示学生信息的JSP页面
 
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="cn.netjava.pojo.Student"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>学生信息</title>

		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

	</head>

	<body>
		<%
  			//得到学生对象
  			Student stu =(Student)request.getSession().getAttribute("stu");
  		 %>
		<div style="text-align:center">
			<table>
				<caption>学生信息</caption>
				<tr>
						<td>姓名</td>
						<td><%=stu.getUsername()%></td>
						<!-- 核心代码:显示图片 -->
						<td rowspan="2"><img src="DisplayServlet"></img></td>
				</tr>
				<tr>
						<td>性别</td>
						<td><%=stu.getSex()%></td>
				</tr>
			</table>
		</div>
	</body>
</html>
  


  这个示例的代码已打包,如果有人感兴趣,或有人有更好的实现方法,欢迎大家一起讨论。
  • 大小: 15.2 KB
  • 大小: 10.7 KB
  • 大小: 9.3 KB
  • 大小: 11.4 KB
3
4
分享到:
评论
5 楼 间谍james 2012-04-03  
PS:追加一下,楼主显示图片是通过id,没有id无法显示
4 楼 间谍james 2012-04-03  
感谢楼主,但是楼主给的jsp代码是否未考虑id,index界面没有增加id,不知道是不是楼主在设计数据库是设为自动增加。
感谢楼主的代码,
3 楼 ~音乐盒~ 2011-11-24  
非常好,谢谢
2 楼 My*Love 2011-04-26  
梦中有你 写道
楼主选的MM 不错

1 楼 梦中有你 2011-04-18  
楼主选的MM 不错

相关推荐

    图片以二进制存取数据库

    当涉及到图像等非结构化数据时,一种常见的方法是将图片以二进制形式存入数据库。这种方法被称为“二进制大对象”(Binary Large Object,简称BLOB)。下面将详细阐述如何实现图片以二进制形式存入数据库,并从...

    图片BASE64加密保存到数据库Blob类型中(放入数据库,并取出生成图片)

    本示例主要涉及的是如何将图片通过BASE64编码加密后存入数据库的Blob类型字段,并能从数据库中取出这些数据再还原成原始图片。以下是相关知识点的详细说明: 1. **BASE64编码**:BASE64是一种用于将二进制数据转换...

    java中读取ORACLE中BLOB字段存储的图片

    通过以上步骤,我们成功地实现了在Java程序中读取Oracle数据库BLOB字段中存储的图片,并在前端页面上显示出来。此方法不仅适用于图片,还可以扩展到其他类型的二进制数据,如音频、视频等文件。这对于构建多媒体应用...

    将图片以字节流存到数据库再从数据库获取显示

    最后,将从数据库获取的字节流转回图片并显示。这一步通常在前端完成,通过HTTP响应将字节流发送给浏览器,浏览器会自动解析并显示图片。在服务器端,我们可以使用`ServletOutputStream`将字节流写入HTTP响应。 `...

    sql server中的image类型的数据导出到oracle的clob字段中

    在 SQL Server 中,Image 类型用于存储二进制大对象(BLOB),如图像、音频、视频等。Image 类型可以存储大量数据,但由于其存储方式和检索机制的限制,Image 类型数据的读写效率较低。 CLOB 字段在 Oracle 中的...

    上传头像(图片)到数据库并显示出来--asp

    本文将详细讲解如何实现这个功能,包括图片的上传、存储到数据库以及从数据库中取出并显示。 首先,我们需要创建一个HTML表单来让用户选择他们想要上传的图片。表单通常包含一个`&lt;input type="file"&gt;`元素,允许...

    插入、取出Blob类型的数据代码示例

    本示例主要讲解如何在Oracle数据库中操作Blob类型的数据,包括插入和取出。 首先,我们需要理解Oracle数据库对Blob类型的处理。Blob是Oracle中的一个大对象数据类型,它可以存储最多4GB的二进制数据。Blob数据可以...

    java存图片到数据库

    1. **图片转二进制流**: 在Java中,我们可以使用`java.io`包中的`FileInputStream`或`BufferedInputStream`类读取图片文件并将其转换为字节流。通过调用`read()`方法,我们可以逐字节地读取文件内容,然后将其存储...

    oracle汉字转拼音

    下面将详细介绍如何在Oracle中进行汉字转拼音,并提供相关的SQL语句示例。 一、Oracle中的汉字转拼音原理 Oracle数据库提供了名为`UTL_I18N`的包,其中包含了处理多语言字符集的函数。在处理汉字转拼音时,我们...

    Blob数据下载到本地

    本篇文章将详细讲解如何从Oracle数据库中下载Blob数据并将其转化为图片文件保存到本地。 首先,我们需要了解Blob数据是如何存储在数据库中的。Blob数据类型可以存储最多4GB的数据,并且它不包含任何关于数据内容的...

    Oracleoem与存储docx

    - **定义**:Spfile 是一种二进制格式的文件,用于存储 Oracle 数据库实例启动时所需的参数。这种格式确保了较高的安全性和效率,但同时也意味着它不能通过普通的文本编辑器(如 vi 或 vim)进行编辑。 - **位置**...

    易语言SQL图片读写

    4. **图片读取**:读取图片通常涉及打开图片文件,将其内容转换成二进制流,然后存入数据库中的BLOB字段。易语言中可以使用“读文件到缓冲区”命令读取文件,再用“转换为字节集”将缓冲区内容转换为适合数据库存储...

    最全的oracle函数大全

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的内置函数,以方便用户进行数据处理和查询。以下是一些在Oracle中常用的函数,这些函数在数据库操作中扮演着重要角色。 1. ASCII函数:ASCII函数...

    计算机软件-商业源码-实例122-在数据库中存取图像.zip

    取出图像时,程序查询数据库,获取`ImageData`字段的二进制数据,再将其写入到响应中,供客户端浏览器解析显示。 这个实例可能包含了实现这一功能的源码,包括数据库连接代码、SQL语句以及读写二进制数据的函数。...

    向数据库中放置和取出文件

    在IT行业中,数据库不仅仅是用来存储结构化数据,如数字、字符串和日期,有时也需要存储非结构化数据,比如图片、文档和其他二进制大对象(BLOB)。标题“向数据库中放置和取出文件”涉及的就是如何在数据库系统中...

    如何在PowerBuilder中动态存取图形数据文件

    因为文件每次只能读取32.765KB,因此需要计算文件的总大小,并通过循环方式分批次读取大型图形文件,并将其保存在长二进制类型的变量中。 4. **写入数据库**:最终通过调用`UpdateBlob()`函数将长二进制类型的数据...

    Oracle SQL内置函数大全

    例如,INSTR('oracle traning','ra',1,2)返回9,表示第二个'ra'的位置。 6. LENGTH函数:计算字符串的长度,不包括空格。在示例中,LENGTH('高乾竞')返回3,LENGTH('北京市海锭区')返回6。 7. LOWER函数:将所有...

    Delphi在SQL存取JPGE、BMP图像.rar_DELPHI 图像_SQL图像_delphi sql ima_图像 del

    最后,从数据库中取出图像数据并显示。可以使用SQL SELECT语句获取图像数据,然后将Blob数据写入一个临时文件,再用TImage组件加载这个临时文件,或者直接将Blob数据赋值给TImage的Bitmap属性。 在Delphi提供的MHT...

    Oracle函数大全

    例如,INSTR('oracle traning', 'ra', 1, 2)将返回9,表示从第一个字符开始,第二个'ra'的位置。 6. LENGTH函数:LENGTH函数返回字符串的长度,不包括结束的空格。例如,LENGTH('高乾竞')返回3。 7. LOWER函数:将...

Global site tag (gtag.js) - Google Analytics