需要编写程序,将图片以二进制流的方式读取并插入到数据库数据表中。数据库中对应字段类型可设置为BLOB
10年的十堰网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都营销网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整十堰建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“十堰网站设计”,“十堰网站推广”以来,每个客户项目都认真落实执行。
在开发过程中,经常会遇到oracle中存图片的情况,下面就为您想介绍一个可以轻松在oracle中存图片的方法,希望对您能有所帮助。
一个存储图片文件的过程,任何开发工具都可以通过调用过程把图片文存储到数据库中。
oracle中存图片的详细步骤:
SQL connect chanet/chanet@oradb;
已连接。
SQL CREATE TABLE IMAGE_LOB (T_ID VARCHAR2 (5) NOT NULL,T_IMAGE BLOB NOT NULL);
表已创建。
SQL CREATE OR REPLACE DIRECTORY IMAGES AS 'C:\Oracle'; --图片目录
目录已创建。
SQL CREATE OR REPLACE PROCEDURE IMG_INSERT (TID VARCHAR2,FILENAME VARCHAR2) AS F_LOB BFILE; B_LOB BLOB; BEGIN INSERT INTO IMAGE_LOB (T_ID, T_IMAGE) VALUES (TID,EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB; F_LOB:= BFILENAME ('IMAGES', FILENAME); DBMS_LOB.FILEOPEN (F_LOB, DBMS_LOB.FILE_READONLY); DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB, DBMS_LOB.GETLENGTH (F_LOB)); DBMS_LOB.FILECLOSE (F_LOB); COMMIT; END; /
过程已创建。
SQL EXEC IMG_INSERT('1','f_TEST.jpg');
PL/SQL 过程已成功完成。
create table test
(
NID VARCHAR2(1) not null,
IMG BLOB,
zhengqueFlag VARCHAR2(1),
cuowuFlag VARCHAR2(1)
)
说明:
1、IMG字段只需要保存图片,将图片信息经过Base64编码,存到数据库BLOB字段中。显示的时候要经过Base64解码。
2、对于像“正确”、“错误”用标志位在区别。你可以用1表示正确、0表示错误。当然你也可以用汉字的保存这样的信息。自己来设计。
然后你到网上查一下怎么样对BLOB字段进行操作。如果不行,我在增加回复。
var MsImg: TMemoryStream;
begin
MsImg := TMemoryStream.Create;
MsImg.LoadFromFile(errorimage);
TmpQuery.close;
TmpQuery.sql.text:='select * from 数据表名 where 条件';
TmpQuery.open;
TmpQuery.edit;
TBlobField(TmpQuery.fieldbyname('字段名')).LoadFromStream(MsImg);
TmpQuery.post;
end;
system下执行
create or replace directory BlobFile as 'C:\TEMP';--路径自己改一下
grant read on directory BlobFile to scott;
scott下建立存放的表
Create Table blobTest(
filename varchar2(200),
filedesc varchar2(200),
filebody blob);
创建过程
Create Or Replace Procedure Proc_loadBlob(p_filename varchar2,p_filedesc varchar2)
Is
src_file bfile;
dst_file BLOB;
lgh_file binary_integer;
Begin
src_file := bfilename('BLOBFILE',p_filename);
insert into blobTest(filename,filedesc,filebody)
values (p_filename,p_filedesc,EMPTY_BLOB())
returning filebody into dst_file;
dbms_lob.fileopen(src_file,dbms_lob.file_readonly);
lgh_file := dbms_lob.getlength(src_file);
dbms_lob.loadfromfile(dst_file,src_file,lgh_file);
update blobTest
set filebody = dst_file
where filename = p_filename;
dbms_lob.fileclose(src_file);
End Proc_loadBlob;
执行插入:
exec Proc_loadBlob('101101.jpeg','给图片命名);
你要是非弄个id的话,可以自己建立一个序列,到时候自增就好了呀
最后给你上图
插入图片/文本(blob /clob)到oracle数据库(引用)
我们在写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/jpeg;charset=GBK"%
不是
%@ page contentType="text/html;charset=GBK"%
否则是以文字显示图片---乱码.
这里研究了上传图片到oralce 里面的程序,关于显示还要麻烦一点,借助资料我实现了,明天再研究一下.
//插入上传图片到数据库
%@ page contentType="text/html;charset=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/html; charset=GBK"
titlegetPicture.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(a0)
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/jpeg;charset=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/jpeg; charset=GBK"
titleshowDBImage.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