java与数据库中图片存取的问题(测试)

最近一直在整理struts2处理与数据库图片存取相关的code,网上也看了不少,结果总是差那么一点点(哈哈),没办法,只有手写个最原始的jdbc到Oracle存取的例子,没想到还有不少收获,顺便将自己的struts2的错误处理也贴上来,存储下。

javaeye的版主们看好了,我这可是存储啊!别再给我评什么茶贴还是什么里。

package com.core.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import oracle.jdbc.OracleResultSet;
import oracle.sql.BLOB;


import com.common.bean.Personnel;

public class TestSQl {

/**
* @param args
*/
public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String user = "xx";
String password = "111";

Connection con = DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
String sql = "";
con.setAutoCommit(false);
//***********************IO****************************
File file = new File("C:\\image\\haha.gif") ;
InputStream is = new FileInputStream(file);
ByteArrayOutputStream os = new ByteArrayOutputStream();

FileOutputStream fos = new FileOutputStream("C:\\image\\haha2.gif");
byte[] buffer = new byte[is.available()];
int b = 0;

while((b = is.read(buffer)) != -1){
os.write(buffer);
if(b > 1024) {
System.out.println(b);
}
}

byte[] photo = os.toByteArray();
System.out.println(photo.length);

ByteArrayInputStream bis = new ByteArrayInputStream(photo);
while(( b = bis.read(buffer)) != -1) {
fos.write(buffer);
}
//************************INSERT*******************************
//插入一条空记录
// sql = "insert into personnel(staffcode,staffname,password,deptcode) values('000115','xxoo','aaa','0001')";
// stmt.execute(sql);
// con.commit();


//***********************SQL*****************************
sql = "select * from personnel per where per.staffcode = '000114' for update";//设置更新,需要con.setAutoCommit(false)
sql = "select * from personnel per where per.staffcode = '000101'";
// sql = "select * from personnel " ;


ResultSet rs = stmt.executeQuery(sql);
List<Personnel> personnellist = new ArrayList<Personnel>();

while(rs.next()){

Personnel personnel = new Personnel();
personnel.setStaffcode(rs.getString("staffcode"));
personnel.setStaffname(rs.getString("staffname"));
personnel.setPhoto(rs.getBytes("photo"));

/*for update 将图片写入数据库*/
// BLOB blob = ((OracleResultSet)rs).getBLOB("photo");
// OutputStream out = blob.getBinaryOutputStream();
// InputStream in = new FileInputStream(new File("C:\\image\\haha2.gif"));
// int size = blob.getBufferSize();
// byte [] buf = new byte[size];
// int count = 0;
// while((count = in.read(buf)) != -1) {
// out.write(buf, 0, count);
// }
// in.close();
// out.close();

/*从数据库读取图片*/
BLOB blob2 = ((OracleResultSet)rs).getBLOB("photo");
InputStream in2 = blob2.getBinaryStream();
OutputStream out2 = new FileOutputStream(new File("C:\\image\\haha5.jpg"));
int size2 = blob2.getBufferSize();
byte [] buf2 = new byte[size2];
int count2 = 0;
while((count2 = in2.read(buf2)) != -1) {
out2.write(buf2, 0, count2);
}
in2.close();
out2.close();

personnellist.add(personnel);
}

con.commit();

for(Personnel pp : personnellist){
//注意pp.getPhoto().length
System.out.println(pp.getStaffcode() + ":: " + pp.getStaffname() + " :: " + pp.getPhoto().length );
}

is.close();
os.close();
bis.close();
fos.close();
con.close();
buffer = null;
photo = null;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}


struts2存储


FileInputStream fis = null;
// OutputStream os = null;
try {
fis = new FileInputStream(file);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
// os = new ByteArrayOutputStream();
// int b;
// while(( b = fis.read()) != -1) {
// os.write(b);
// }
//
System.out.println(buffer.length);
personnel.setPhoto(buffer);
personnelService.addPersonnel(personnel);
// fis.read(personnel.getPhoto());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if( fis != null ) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

struts2读取

HttpServletResponse response = null;
ServletOutputStream out = null;
InputStream in = null;
byte [] bytes = null;
personnel = personnelService.findPersonnel(staffcode);

try {
response = ServletActionContext.getResponse();
response.setContentType("image/jpeg");
out = response.getOutputStream();
in = new ByteArrayInputStream(personnel.getPhoto());

bytes = new byte [ in.available() ];
while ( -1 != in.read( bytes ) ) {
out.write( bytes );
}

out.flush();
// out.close();
// out = null;
// response.flushBuffer();
// out.clear();
// out = pageContext.pushBody();
} catch (IOException e) {
e.printStackTrace();
} catch ( Exception e ) {
e.printStackTrace();
}
finally {
if ( in != null ) {
try {
in.close();
} catch ( IOException e ) {
e.printStackTrace();
}
}
if ( out != null ) {
try {
out.close();
} catch ( IOException e ) {
e.printStackTrace();
}
}
bytes = null;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值