使用java读取oracleblob字段实现上传下载.docx
- 文档编号:29838162
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:21
- 大小:19.50KB
使用java读取oracleblob字段实现上传下载.docx
《使用java读取oracleblob字段实现上传下载.docx》由会员分享,可在线阅读,更多相关《使用java读取oracleblob字段实现上传下载.docx(21页珍藏版)》请在冰豆网上搜索。
使用java读取oracleblob字段实现上传下载
使用JAVA读取ORACLEBLOB字段实现上传下载
大对象类型BLOB全称为BinaryLargeObjects,即二进制大对象。
可以把BLOB区别为三种形式:
声像数据、二进制数据和大文本数据。
因此,最常见的应用就是存储图形、声音等对象,此外大二进制对象、OLE对象也可以通过BLOB类型存入数据库,如果文本对象过大,超出了文本类型的规定长度,则必须用BLOB字段进行存储。
我们在经常使用的编程环境中并不能直接支持BLOB字段,因此需要调用相应的函数完成BLOB的使用。
二实际Struts项目的处理流程
1插入BLOB字段的流程
表示层:
上传使用struts的 fileproperty="drawingFile"/>标签,提交给指定处理的Action,在ActionForm中使用struts自带的FormFile 来保存文件。 核心代码: formaction="/DrawingInputMultiAction"enctype="multipart/form-data"> fileproperty="drawingFile"/> ....省略 form> 控制层: 在Action中将传入的ActionForm中的文件字段赋给VO值对象,并调用业务代理类的上传方法。 核心代码: .省略其他set方法 .省略 } Facade门面: 通过业务代理类调用DAO中的上传方法,对客户端完全透明。 publicintinsertDrawing(DrawingVOdrawingVO)throwsComtopModuleException{ try{ DrawingDAOdrawingDAO=newDrawingDAO(); return(drawingVO); }catch(DrawingExceptionex){ thrownewComtopModuleException("",ex); } } 持久层: DAO中实现和ORACLE数据库的底层交涉,完成真正的文件上传。 需要先插入一个空BLOB对象,然后Update这个空对象。 publicintinsertDrawing(DrawingVOdrawingVO)throwsDrawingException{ PreparedStatementpstmt=null; Statementstmt=null; Connectionconn=null; intiKey=0; ResultSetrs=null; ."+ "CONTENT)"+ "values(,,省略...,empty_blob())"; etNextKey; (1,iKey); ....省略其他set方法 (); stmt=, ; strSQLUpdate= "SELECTCONTENTFROMPROD_DRAWINGWHEREDRAWING_ID='"+ iKey+"'"+"FORUPDATE"; OracleThinBlob) (1); ("得到输出流"); OutputStreamoutStream=(); InputStreamfin=(); ("开始分配缓存"); byte[]b=newbyte[()]; intlen=0; while((len=(b))! =-1){ ("正在写入BLOB流"); (b,0,len); } ("关闭所有流"); (); (); (); } (); (); }catch(Exceptionex){ ...省略 }finally{ (rs,pstmt,conn); } returniKey; } 2读取BLOB字段的流程 从数据库中读出BLOB数据没有上述由于连接池的不同带来的差异,程序流程同插入BLOB字段,但是读BLOB就不用那么复杂了,只需要J2SE的标准类就可以取得输出流。 DAO中的核心代码: publicDrawingVOreadDrawing(intdrawingId)throwsDrawingException{ PreparedStatementpstmt=null; Connectionconn=null; DrawingVOobjDrawingVO=null; ResultSetrs=null; .省略其他set方法 .省略 }finally{ (rs,pstmt,conn); } returnobjDrawingVO; } 这样,传到Action中VO对象就包含这个BLOB对象了,然后需要在Action中对该对象转为输入流,可以选择文件输出流或Servlet输出流,根据具体情况定,这里选择文件输出流。 核心代码: privateStringgetBlobToFile(Blobblob,DrawingVOobjDrawingVO)throwsException{ InputStreamins=(); + (); StringstrRootFilePath=().getServletContext().getRealPath(""); StringstrFilePath="/temp/"+strFileName; StringcontextFilePath=strRootFilePath+strFilePath; etServletContext().getRealPath("")+"/temp"); if(! ()){ (); } ; import .*; public class BlobOperation { public static void addLob(long id, String binFile) throws SQLException { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = (); etBinaryStream(0);etBufferSize(); "bufferSize: "+bufferSize); BufferedInputStreamin=newBufferedInputStream( newFileInputStream("d: /360安全卫士定.exe"),bufferSize); byte[]b=newbyte[bufferSize]; intcount=(b,0,bufferSize); intamount=0; while(count! =-1){ (b,0,count); amount+=count; "处理了"+amount+"字节"); count=(b,0,bufferSize); "处理了"+amount+"字节,成功"); } (); out=null; (); (); } }catch(ClassNotFoundExceptione){ }catch(SQLExceptione){ try{ (); }catch(SQLExceptione1){ } }catch(IOExceptione){ }finally{ try{ if(conn! =null) (); }catch(SQLExceptione){ } } } /** *读大文本 * */ privatevoidreadClob(){ Connectionconn=null; try{ conn=getConnection(); Statementstmt=(); ResultSetrs=("select*fromtestwhereid=2"); StringtempStr=null; if()){ Clobclob=("CLOBCONTENT"); if(clob! =null){ Readerin=(); BufferedReaderbr=newBufferedReader(in); "开始读...."); while((tempStr=())! =null){ } "读完成...."); (); } (); (); } }catch(ClassNotFoundExceptione){ }catch(SQLExceptione){ }catch(IOExceptione){ }finally{ try{ if(conn! =null) (); }catch(SQLExceptione){ } } } /** *写大文本 * */ privatevoidwriteClob(){ Connectionconn=null; try{ conn=getConnection(); (false); Stringsql=null; Statementstmt=(); sql="deletefromtestwhereid=2"; (sql); sql="insertintotestvalues(2,empty_blob(),empty_clob())"; (sql); ResultSetrs=("select*fromtestwhereid=2"); if()){ Clobclob=("CLOBCONTENT"); PrintWriterout=newPrintWriter(newBufferedWriter( (clob).setCharacterStream(0))); BufferedReaderin=newBufferedReader(newInputStreamReader( newFileInputStream( "d: /在北大校园BBS引起轰动的一篇文章请热爱祖国的人转发! ! ! ! .mht"))); Stringstr=null; "开始写..."); while((str=())! =null){ (str); } (); (); (); (); } }catch(ClassNotFoundExceptione){ }catch(SQLExceptione){ try{ (); }catch(SQLExceptione1){ } }catch(IOExceptione){ }finally{ try{ if(conn! =null) (); }catch(SQLExceptione){ } } } privateConnectiongetConnection()throwsClassNotFoundException, SQLException{ (driver); return(url,user,pwd); } /** * *@paramrs *@throwsSQLException */ privatevoiddisplayResultSet(ResultSetrs)throwsSQLException{ ResultSetMetaDatarsmd=(); intcolnum=(); while()){ for(inti=0;i if(i==colnum-1) +1)+": " +(i+1)); else +1)+": " +(i+1)+","); } } } } 一般来说,大对象存储是把文件存到数据库中,当然也可以内存中的超大字符串。 对于象图片这样的文件当然是用二进制存储,这里有很多误区,网络上的教程99%都是行不通的,连SUN自己的文档都一直错误,虽然错误很小。 按说二进制文件应该存为BLOB类型,但JBDC2并不能直接对BLOB存入二进制文件,如果你这样做,会得到一个IO而不是SQL异常,为此花了我近两个小时才弄清楚。 如果要把一个二制文件存入ORACLE,用标准的JDBC你就要用LONGROW类型: createtabletb_file(namevarchar(20),detaillongrow); 然后 Filefile=newFile(""); intfileLength=(int)(); InputStreamfin=newFileInputStream(file); PreparedStatementpstmt=("insertintotb_filevalues('',)"); (1,fin,fileLength); (); 如果你一定要用BLOB存储,你就必须用ORACLE自己的方法: createtabletb_file(namevarchar(20),detailBLOB); (false); ("insertintotb_filevalues('',empty_blob())"); 下面必须SELECT得到BLOB的对象再向里写: rs=("selectdetailfromtb_filewherename=''forupfdate"); if()) { Blobblob= (1); BinaryOutputStreamout=( byte[]b=newbyte[( InputStreamfin=newFileInputStream(file); intlen=0; while((len=(b))! =-1) (b,0,len); (); (); (); } 同样读取数据你并不能象LONGROW那样 InputStreamin=("detail"); 而要 Blobblob=("detail"); in=(); 我想用如下程序调用oracle图片数据 分别为longraw和blob 加上 (false); 能够正确显示,但是实际上数据里面却没有二进制数据 不加,运行时出现错误 读取违反顺序 请大侠帮忙看看怎么回事 package ; import .*; import .*; import .*; import import .*; import .*; import import .*; class ImageOracle extends Frame { static String url ; static String username; static String password; static Connection conn; static Statement stmt; static byte[] imageData; static byte[] imageData1; public ImageOracle() { url = "jdbc: oracle: thin: @ruixp: 1521: oracledb"; username = "system"; password = "manager"; addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); (0); } }); } public static void main(String args[]) throws Exception{ "Starting ImageOracle..."); ImageOracle mainFrame = new ImageOracle(); (400, 400); ("ImageOracle"); .\n"); } catch (SQLException e) { "表不存在\n"); } .\n"); etBLOB(3);//绑定字段变量 InsertThumbnailImage(blob);//将缩略图文件存入数据库 ReadThumbnailImage(blob); //将缩略图读出,并存为相应的图片文件 } catch (SQLException e) { "SQL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 java 读取 oracleblob 字段 实现 上传下载