❶ java删除上传到oracle数据库的图片,删除记录的同时删除数据库本地图片,如何删除记录的同时定位到图片
1、明白一些概览:
1)上传的图片并没有真正的存储在oracle数据库里,orcale数据库里其实存储的是图片的路径。
2)从浏览器上传图片到后端Action,action调用相应文件存储逻辑(文件存储系统)由文件存储系统完成图片的存储,并返回文件的路径。最后将这个路径保存到oracle数据库(这个部分可以很简单也可以很复杂视实际情况而定)。
2、相关删除逻辑,通过数据库里的文件路径找到实际的存储位置执行删除。删除成功后再删除数据库里相关记录。
❷ 通过java将图片存储到oracle中
其实这个更简单,你可以试试
❸ java中oracle多个blob类型如何在jsp中显示成图片
使用WSH(webwork,spring,hibernate)技术,在页面中加载10-20个图片时,因为数据都是在oracle 10g中以blob类型存储,页面代码采用webwork标签iterator遍历集合,iterator标签里写了一个<img>
前台代码如下:
<ww:iteratorvalue="bloblist"id="it"status="rowstatus">
<%--显示图片--%>
<imgid='<ww:propertyvalue="id"/>'name="imgId"width="120"height="120"src="/blobUtil/getImg.action?id=<ww:propertyvalue='bloblist[#rowstatus.index].id'/>"/>
</ww:iterator>
后台代码:
publicStringgetImg()throwsException{
BufferedInputStreamins;//取得BLOB的IO流
OutputStreamops;
byte[]bt=null;
getResponse().setContentType("image/JPEG");
Blobbo=bjqeDtRelationService.getBjqeDtRelationChildBlob(imgId);
if(bo==null)returnnull;
InputStreamis=bo.getBinaryStream();
ins=newBufferedInputStream(is);
intbufferSize=(int)bo.length();//取得BLOB的长度
bt=newbyte[bufferSize];
ins.read(bt,0,bufferSize);
getResponse().getOutputStream().write(bt);
ops=getResponse().getOutputStream();
ops.flush();
ops.close();
ins.close();
returnnull;
}
❹ JavaEE使用Oracle数据库怎么存放和提取图片、音频文件
使用io将图片音频之类的二进制文件转化为数据流,然后存入数据库类型为BLOB。jsp调用就反过来。
❺ java如何把图片转换成二进制并存到oracle的blob中,求代码
importjavax.imageio.ImageIO;
importjava.awt.image.BufferedImage;
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.File;
importjava.io.IOException;
publicclassImageUtils{
publicstaticvoidmain(String[]args){
Stringstr=img2Binary("C:\Users\hny\Desktop\favicon.jpg");
System.out.println(str);
binary2Img("C:\Users\hny\Desktop\favicon2.jpg",str);
}
/**
*图片转二进制字符串
*
*@parampath图片路径
*@return
*/
publicstaticStringimg2Binary(Stringpath){
Filefile=newFile(path);
if(!file.exists()){
returnnull;
}
try{
BufferedImagebi=ImageIO.read(file);
ByteArrayOutputStreambaos=newByteArrayOutputStream();
Stringsuffix=getSuffix(path);
ImageIO.write(bi,suffix,baos);
byte[]bytes=baos.toByteArray();
returnnewsun.misc.BASE64Encoder().encodeBuffer(bytes).trim();
}catch(IOExceptione){
e.printStackTrace();
}
returnnull;
}
/**
*字符串转图片文件
*
*@parampath图片路径
*@paramimgBinary图片字符串
*/
publicstaticvoidbinary2Img(Stringpath,StringimgBinary){
try{
Filefile=newFile(path);
byte[]bytes1=newsun.misc.BASE64Decoder().decodeBuffer(imgBinary);
ByteArrayInputStreams=newByteArrayInputStream(bytes1);
BufferedImagebi1=ImageIO.read(s);
Stringsuffix=getSuffix(path);
ImageIO.write(bi1,suffix,file);
}catch(IOExceptione){
e.printStackTrace();
}
}
/**
*获取图片后缀名
*
*@parampath
*@return
*/
privatestaticStringgetSuffix(Stringpath){
intindex=path.contains(".")?path.lastIndexOf("."):-1;
if(index>-1){
returnpath.substring(index+1);
}
returnnull;
}
}
❻ 关于JAVA~~~~ 如何将图片等大对象存入ORACLE中~~求详解!(代码)
插入图片/文本(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/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">
<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/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">
<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>
❼ Java中如何使用Struts2实现将图片以二进制流的形式存储到Oracle数据库,不使用JDBC
我写了个例子,你可以参考下,保存图片形式是二进制import java.io.*;
import java.sql.*;
public class FileImage1{
public void insert(String name,File file)
{
Connection con=null;
try {
con=DBhelper.getCon();
String sql="insert into addImage values(?,?)";
PreparedStatement ps=con.prepareStatement(sql);
BufferedInputStream input=new BufferedInputStream(new FileInputStream(file));//可缓冲字节流
//InputStream input=new FileInputStream(file);
int k=input.available();
ps.setString(1,name);
ps.setBinaryStream(2, input, k);
int result=ps.executeUpdate();
if(result>0)
System.out.println("保存成功");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}public static void main(String[] args) {
new FileImage1().insert("张远",new File("D:\\图片\\lin.jpg"));
}
}
❽ 如何用Java把图片插入到oracle数据库
用oracle的blob数据类型存储,jdbc调用setBinaryStream(index,inputstream,inputstream.available
())存进去即可
❾ Java操作oracle存入图片,为什么存不进,进入SQL/PLUS,select count(*) from imgic;结果是0,郁闷
你的程序应该是没问题的,看看数据库是不是有问题?