public class InsertBlobData {
Connection con = null
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
InsertBlobData data = new InsertBlobData()
data.insertBlogInfo("002jpg", "sdsdfdf", "2007-02-12", "002.jpg")
}
public void insertBlogInfo(String jmzh, String xm, String smsj,
String fileName) throws Exception {
// try {
con = ConnectionPoliceFactory.getFactory().getConnection()
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace()
// }
// 处理事务
boolean defaultCommit = con.getAutoCommit()
con.setAutoCommit(false)
Statement st = con.createStatement()
// 插入一个空对象
st.executeUpdate("insert into ksren_txxx(jmzh,xm,smsj,txsj) values('"
+ jmzh + "','" + xm + "',to_date('" + smsj
+ "','yyyy-mm-dd'),empty_blob())")
// 用for update方式锁定数据行
ResultSet rs = st
.executeQuery("select txsj from ksren_txxx where jmzh='"
+ jmzh + "' and xm='" + xm + "' for update")
if (rs.next()) {
// 得到java.sql.Blob对象,然后Cast为oracle.sql.BLOB
oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(1)
// 到数据库的输出流
OutputStream outStream = blob.getBinaryOutputStream()
// 这里用一个文件模拟输入流
InputStream fin = new FileInputStream(new File(fileName))
// 将输入流写到输出流
byte[] b = new byte[blob.getBufferSize()]
int len = 0
while ((len = fin.read(b)) != -1) {
outStream.write(b, 0, len)
// blob.putBytes(1,b)
}
// 依次关闭(注意顺序)
fin.close()
outStream.flush()
outStream.close()
con.commit()
/* 恢复原提交状态 */
con.setAutoCommit(defaultCommit)
con.close()
}
}
}
package com.jspdev.ch13import com.jspdev.util.*
import java.sql.*
import javax.sql.*
import java.io.*
import oracle.jdbc.driver.OracleResultSet
import oracle.sql.BLOB
public class BlobBean
{
Connection conn
/**
*构造方法,创建Connection对象,并且在数据库中添加一个表。
*/
public BlobBean()throws Exception
{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver())
conn = DriverManager.getConnection("jdbc:oracle:thin:system@127.0.0.1:1521:hellking", "system", "manager")
// conn.createStatement().execute("create table blobtable(blobvalue blob)")
}
/**
*写入Blob数据到数据库
*/
public void addBlob(String fileName)throws Exception
{
conn.setAutoCommit(false)
Statement stmt = conn.createStatement()
stmt.execute("insert into blobtable values (empty_blob())")
ResultSet rset = stmt.executeQuery("SELECT blobvalue FROM blobtable FOR UPDATE")
BLOB blob = null
while (rset.next()) {
blob = ((OracleResultSet) rset).getBLOB(1)
System.out.println(blob.length())
}
File binaryFile = new File(fileName)
System.out.println(fileName+"'s length = " + binaryFile.length())
FileInputStream instream = new FileInputStream(binaryFile)
OutputStream outstream = blob.getBinaryOutputStream()
int chunk = blob.getChunkSize()
System.out.println("chunk size = " + chunk)
byte[] buffer = new byte[chunk]
int length = -1
while ((length = instream.read(buffer)) != -1)
outstream.write(buffer, 0, length)
instream.close()
outstream.close()
conn.commit()
}
插入图片/文本(blob /clob)到oracle数据库(引用http://www.java-asp.net/java/200512/t_48888.html)我们在写OA的时候经常遇到的问题就是员工图片档案的储存问题,解决这个问题有两个方法,
1.JSP/html页面里面读取web服务器上的图片,也就是把图片放到(上传)到web 服务器上,然后用html 语句读取:
<img src=" 绝对或相对路径 " border="0" />
2.就是上传到数据库里面(oracle).关于oracle 数据库,它支持blob, 和clob, 分别对应着图片和文本(长字符串) *** 作
由于性能原因,我们还是要采用第二种方法,而且存到数据库里面比较容易管理,是吧?
首先,我们要解决上传问题,这里采用普遍使用的apache commons 组件里面的FileUpload class.
具体步骤如:
DiskFileUpload dfu=new DiskFileUpload()
dfu.setSizeMax(100000000)
dfu.setSizeThreshold(100000)
dfu.setRepositoryPath("f:\\public")
try{
List fileItems=dfu.parseRequest(request)
Iterator i=fileItems.iterator()
while(i.hasNext()){
FileItem fi=(FileItem)i.next()
if(!fi.isFormField()){
name=fi.getName()
size=fi.getSize()
if((name==null||name.equals(""))&&size==0)
continue
}
name=fi.getName()
size=fi.getSize()
(InputStream)is=fi.getInputStream()
}
上面的代码是web服务器接受上传的代码,参考文件已经在我上篇写的上传文本文件里给出,今天,终于想明白了:
dfu.setRepositoryPath("f:\\public")的意思
原来是转义字符也就是说\n\t等而要打印反斜杠要用\\,其实这个问题原先已经知道,可是由于经验没有写过图片上传处理什么的,觉得很高深,也很可怕,哈哈,心里有点畏惧.看来基础的东西,那怕一点点小细节也很重要,接着还有下面的java IO 问题.刚才读core java 的时候突然发现在讲io的时候特意提醒了这个问题,可是我没有注意!
通过上面的代码已经实现文件上传了.然后,我们要实现JDBC数据源链接,目的是要把数据插入到oracle.
Context ctx=new InitialContext()
DataSource ds=(DataSource)ctx.lookup("jdbc/asdbCoreDS")
conn=ds.getConnection()
conn.setAutoCommit(false)
关于要import java.sql.* javax.sql.* java.naming.* 不再详细叙述了
接着根据很有用的一篇文章的提示,插入blob类型一定要先1.插入一个空的
String insert=" insert into uploadpicture "+
" values(?, empty_blob()) "
2.然后找到这个blob的oracle 里面的游标:
String findCursor=" select content "+
" from uploadpicture "+
" where name=? for update "
注意这个for update(注意!!!必须加for update,这将锁定该行,直至该行被修改完毕,保证不产生并发冲突。这里还是难以理解,先记下来吧)
3.然后再修改
String update=" update uploadpicture "+
" set content=? "+
" where name=? "
这里的问号是为PreparedStatement参数处理而写的!
写这个程序用到了oracle.sql.BLOB class ,这个类是用来 *** 作BLOB数据类型的
当我们通过ResultSet 对象得到
blob=(BLOB)rs.getBlob(1)
的时候我不知道如何处理了,Blob 是什么?String, int ,long? 我现在也不明白!估计CSDN上的人也不明白,否则我发个帖子半天没有人回答,也许是很烂,也许是太简单了,大家不屑一顾,看来我还要继续追赶!
不发牢骚了,回到程序里(总觉得自己的发散思维很强,看来写程序的时候不能这样,多亏java 是纯面向对象语言,如果是过程就麻烦了)
我们如何处理这个blob 呢?回答是,不管它是什么,直接写入 BufferedOutputStream out1 =new BufferedOutputStream(blob.getBinaryOutputStream())
这里是建立了缓冲写如blob 的流(注意getBinaryOutputStream()已经不被赞成使用了,一定有更优秀的方法替代!),说到流,我到现在还有点晕,类很多,不知道究竟用哪个好!
基础的东西非常重要,这曾经是我的口头禅,这里用到了流的读入写和写入,有些流是从文件或其它位置上读取字节(如, FileInputStream),有写流是把字节组合成有用的数据(如, DataInputStream).我们读取数字的时候,需要首先建议一个FileInpuStream, 然后, 再把该类的对象传递给DataInputStream
FileInputStream fin=new FileInputStream(“emp.dat”)
DataInputStream din=new DataInputStream(fin)//把fin传递给din
double s=din.readDouble()
默认情况下,流是没有缓冲的, 如果使用缓冲就是
DataInputStream din=new DataInputStream(
new BufferedInputStream(new FileINputStream(“emp.dat”)))
有了这点理解也很管用,
BufferedOutputStream out1 =new BufferedOutputStream(blob.getBinaryOutputStream())
就是建立一个缓冲写的对象到blob.注意这里的out1 不是out,否则程序运行的时候不能打印了temp 数据了!
已经准备好如何写了, 可是如何读呢?
BufferedInputStream in=new BufferedInputStream(is)
在我们上传的时候 (InputStream)is=fi.getInputStream()
读取图片为输入的流.保存为is 对象,然后就用到这里了,准备好了读和写了,我们开始干活:
int c
while((c=in.read())!=-1) {out1.write(c)}
in.close()
out1.close()
通过缓冲一个个读数据,然后一个个写数据.-1 为文件的末尾,
最后当读写完成后我们要关闭读写对象!
程序分析就是这样,以后还要对此问题进行研究,最后还要注意,
<%@ page contentType="image/jpegcharset=GBK"%>
不是
<%@ page contentType="text/htmlcharset=GBK"%>
否则是以文字显示图片---乱码.
这里研究了上传图片到oralce 里面的程序,关于显示还要麻烦一点,借助资料我实现了,明天再研究一下.
//插入上传图片到数据库
<%@ page contentType="text/htmlcharset=GBK"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="org.apache.commons.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="oracle.sql.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/htmlcharset=GBK">
<title>getPicture.jsp</title>
</head>
<body>
<%
request.setCharacterEncoding("GBK")
String name=null
long size=0
Connection conn=null
String insert=" insert into uploadpicture "+
" values(?, empty_blob()) "
String findCursor=" select content "+
" from uploadpicture "+
" where name=? for update "
String update=" update uploadpicture "+
" set content=? "+
" where name=? "
BLOB blob=null
InputStream is=null
DiskFileUpload dfu=new DiskFileUpload()
dfu.setSizeMax(100000000)
dfu.setSizeThreshold(100000)
dfu.setRepositoryPath("f:\\public")
try{
List fileItems=dfu.parseRequest(request)
Iterator i=fileItems.iterator()
while(i.hasNext()){
FileItem fi=(FileItem)i.next()
if(!fi.isFormField()){
name=fi.getName()
size=fi.getSize()
if((name==null||name.equals(""))&&size==0)
continue
}
name=fi.getName()
size=fi.getSize()
is=fi.getInputStream()
}
Context ctx=new InitialContext()
DataSource ds=(DataSource)ctx.lookup("jdbc/asdbCoreDS")
conn=ds.getConnection()
conn.setAutoCommit(false)
//step 1
PreparedStatement ps=conn.prepareStatement(insert)
ps.setString(1, name)
int a=ps.executeUpdate()
if(a>0)
out.println("insert success!"+"<br>")
//step 2
ps=conn.prepareStatement(findCursor)
ps.setString(1, name)
ResultSet rs=ps.executeQuery()
while(rs.next())
{
blob=(BLOB)rs.getBlob(1)
out.println("find cursor success!"+"<br>")
out.println("cursor:"+blob+"<br>")
//step 3
ps=conn.prepareStatement(update)
ps.setBlob(1, blob)
ps.setString(2, name)
ps.executeUpdate()
ps.close()
BufferedOutputStream out1 =new BufferedOutputStream(blob.getBinaryOutputStream())
BufferedInputStream in=new BufferedInputStream(is)
int c
while((c=in.read())!=-1) {out1.write(c)}
in.close()
out1.close()
out.println("update success!"+"<br>")}
conn.commit()
}
catch(SQLException se)
{se.printStackTrace()}
catch(FileUploadException fue)
{fue.printStackTrace()}
%>
</body>
</html>
//显示数据库里面的图片
<%@ page contentType="image/jpegcharset=GBK"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="java.io.*"%>
<%@ page import="com.sun.image.codec.jpeg.*"%>
<%@ page import="javax.imageio.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.awt.image.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="image/jpegcharset=GBK">
<title>showDBImage.jsp</title>
</head>
<body>
<%
String showImage=" select * "+
" from uploadpicture "+
" where name=´TXC with snow.JPG´ "
Connection conn=null
BufferedInputStream inputImage=null
try{
Context ctx=new InitialContext()
DataSource ds=(DataSource)ctx.lookup("jdbc/asdbCoreDS")
conn=ds.getConnection()
Statement st=conn.createStatement()
ResultSet rs=st.executeQuery(showImage)
while(rs.next())
{
oracle.sql.BLOB blob=(oracle.sql.BLOB)rs.getBlob("content")
inputImage =new BufferedInputStream(blob.getBinaryStream())
/*String name=rs.getString(1)
String content=rs.getString(2)
out.println(name+"<br>")*/}
BufferedImage image=null
image=ImageIO.read(inputImage)
ServletOutputStream sos=response.getOutputStream()
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(sos)
encoder.encode(image)
inputImage.close()
conn.commit()
}
catch(SQLException se)
{se.printStackTrace()
conn.rollback() }
catch(IOException ie)
{ie.printStackTrace()}
%>
</body>
</html>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)