前台:
fieldLabel:"照片附件",
width:400,
name:"photo",
inputType:"file",
id:"photo"
注意:上传图片组件所在的form里必须加一个属性:fileUpload : true。
后台:
将图片直接存在Oracle数据库中的Blob对象中
//保存图片
public boolean savePhoto(String rid,File photo){
Connection conn=null;
PreparedStatement pstmt=null;
FileInputStream file=null;
Statement stmt=null;
ResultSet rs=null;
InputStream in=null;
FileOutputStream out=null;
try {
//从hibernate那获得connection
Session session = this.getSession();
conn =session.connection();
conn.setAutoCommit(false);
pstmt=conn.prepareStatement("update t_a_resident_archives set photo=? where rid=?");
file=new FileInputStream(photo);
pstmt.setBlob(1, file);
pstmt.setString(2, rid);
pstmt.executeUpdate();
conn.commit(); //到此,图片已成功保存,下面就是从数据库中取文件,用于判断是否真的保存成功了!
//取数据库中的上传的图片
stmt=conn.createStatement();
String sql="select photo from t_a_resident_archives where rid=" + rid;
rs=stmt.executeQuery(sql);
byte[] buffer=new byte[1024];
Blob blob=null;
while(rs.next()){
blob=rs.getBlob(1);
}
in=blob.getBinaryStream();
//存放文件的路径
out=new FileOutputStream("D:\\888.jpg");
int number=in.read(buffer);
//把读取的数据放到字节数组,并写到文件中
while(number!=-1){
out.write(buffer,0,number);
number=in.read(buffer);
}
rs.close();
stmt.close();
in.close();
out.close();
file.close();
pstmt.close();
conn.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
(1)之前这样写后,虽然保存成功了,但IE浏览器总是出现下载文件的提示。
解决办法:
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=UTF-8"); //这句话很重要哦!
(2)另外一个需要注意的问题:
上面用到setBlob()这个方法,使用此方法,必须用到下面的配置才能支持此方法。
jdk:1.6版本
oracle的驱动包:ojdbc6.jar(此包支持jdk1.6的)
oracle的数据库连接池包:commons-dbcp-1.4.jar
(3)我的Hibernate配置文件夹里此字段用的type:java.sql.Blob,对应的bean里该字段也是Blob类型的。
OK!到此上传图片成功解决!