实现向MYSQL数据库中存储或提取图片文件
发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,一些情况下,需要向数据库中存储一些2进制文件,比如图片文件等,这时候,向数据库存储数据不同于普通的字符串存储,我们需要对这个2进制文件使用JAVA处理2进制流的API进行处理,然后再进行存储。我们需要
千家信息网最后更新 2024年11月14日实现向MYSQL数据库中存储或提取图片文件一些情况下,需要向数据库中存储一些2进制文件,比如图片文件等,这时候,向数据库存储数据不同于普通的字符串存储,我们需要对这个2进制文件使用JAVA处理2进制流的API进行处理,然后再进行存储。我们需要进行以下步骤来实现:
向数据库中存储文件的时候,一样使用标准SQL语句,如: insert into database (column1, column2,..) values(v1,v2,…);注意的是,要在建立存放2进制文件的TABLE时,存放的字段要使用BLOB类型,而不是普通的VARCHAR等。BLOB是专门存储2进制文件的类型,他还有大小之分,比如mediablob,logblob等,以存储大小不同的2进制文件,一般的图形文件使用mediablob足以了。
1 见以下代码实现向MYSQL中储存图片文件:
…………………………
private final String insertquery = "insert into employeephoto (Employee_ID,Binary_Photo,LastMod,Created) values (?,?, NOW(), NOW())";
public void doInsertStaffPic(String loginname,String source_URL) {
Connection conn = null;
PreparedStatement pre = null;
try {
// 进行数据库连接,这里我使用的是在STRUTS中配置的连接池,当然也可// 以自己通过JDBC直接连
conn = DBProcess.getConnection();
//从图片源中获得图片对象并写到缓存中
Image image = new ImageIcon(source_URL).getImage();
BufferedImage bImage = new BufferedImage(image.getWidth(null),
image.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics bg = bImage.getGraphics();
bg.drawImage(image, 0, 0, null);
bg.dispose();
//将图片写入2进制的输出流 并放如到byte[] buf中
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bImage, "jpg", out);
byte[] buf = out.toByteArray();
//获得这个输出流并将他设置到BLOB中
ByteArrayInputStream inStream = new ByteArrayInputStream(buf);
pre = conn.prepareStatement(insertstaffpicquery);
pre.setString(1, loginname);
pre.setBinaryStream(2, inStream, inStream.available());
// 执行写如数据
pre.executeUpdate();
} catch (Exception exc) {
exc.printStackTrace();
}
finally {
try {
pre.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2 下代码实现从MYSQL中获取图片文件并写入本地文件系统:
…………………………
private final String writeoutquery = "insert into employeephoto (Employee_ID,Binary_Photo,LastMod,Created) values (?,?, NOW(), NOW())";
// retrive the picture data from database and write it to the local disk
public void doGetAndShowStaffPic(String loginname, String dir) {
FileOutputStream output = null;
InputStream input = null;
Connection conn = null;
ResultSet rs = null;
PreparedStatement pre = null;
try {
conn = DBProcess.getConnection();
pre = conn.prepareStatement(writeoutquery);
pre.setString(1, loginname);
rs = pre.executeQuery();
if (rs.next()) {
// 从数据库获得2进制文件数据
Blob image = rs.getBlob("Binary_Photo");
// setup the streams
Input = image.getBinaryStream();
try {
// 设置写出路径。
output = new FileOutputStream(dir);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
// set read buffer size 注意不要设置的太小,要是太小,图片可能不完整
byte[] rb = new byte[1024000];
int ch = 0;
// process blob
try {
// 写入本地文件系统
while ((ch = input.read(rb)) != -1) {
output.write(rb, 0, ch);
}
} catch (IOException e) {
e.printStackTrace();
}
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
finally {
try {
rs.close();
pre.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
[@more@]
向数据库中存储文件的时候,一样使用标准SQL语句,如: insert into database (column1, column2,..) values(v1,v2,…);注意的是,要在建立存放2进制文件的TABLE时,存放的字段要使用BLOB类型,而不是普通的VARCHAR等。BLOB是专门存储2进制文件的类型,他还有大小之分,比如mediablob,logblob等,以存储大小不同的2进制文件,一般的图形文件使用mediablob足以了。
1 见以下代码实现向MYSQL中储存图片文件:
…………………………
private final String insertquery = "insert into employeephoto (Employee_ID,Binary_Photo,LastMod,Created) values (?,?, NOW(), NOW())";
public void doInsertStaffPic(String loginname,String source_URL) {
Connection conn = null;
PreparedStatement pre = null;
try {
// 进行数据库连接,这里我使用的是在STRUTS中配置的连接池,当然也可// 以自己通过JDBC直接连
conn = DBProcess.getConnection();
//从图片源中获得图片对象并写到缓存中
Image image = new ImageIcon(source_URL).getImage();
BufferedImage bImage = new BufferedImage(image.getWidth(null),
image.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics bg = bImage.getGraphics();
bg.drawImage(image, 0, 0, null);
bg.dispose();
//将图片写入2进制的输出流 并放如到byte[] buf中
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bImage, "jpg", out);
byte[] buf = out.toByteArray();
//获得这个输出流并将他设置到BLOB中
ByteArrayInputStream inStream = new ByteArrayInputStream(buf);
pre = conn.prepareStatement(insertstaffpicquery);
pre.setString(1, loginname);
pre.setBinaryStream(2, inStream, inStream.available());
// 执行写如数据
pre.executeUpdate();
} catch (Exception exc) {
exc.printStackTrace();
}
finally {
try {
pre.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2 下代码实现从MYSQL中获取图片文件并写入本地文件系统:
…………………………
private final String writeoutquery = "insert into employeephoto (Employee_ID,Binary_Photo,LastMod,Created) values (?,?, NOW(), NOW())";
// retrive the picture data from database and write it to the local disk
public void doGetAndShowStaffPic(String loginname, String dir) {
FileOutputStream output = null;
InputStream input = null;
Connection conn = null;
ResultSet rs = null;
PreparedStatement pre = null;
try {
conn = DBProcess.getConnection();
pre = conn.prepareStatement(writeoutquery);
pre.setString(1, loginname);
rs = pre.executeQuery();
if (rs.next()) {
// 从数据库获得2进制文件数据
Blob image = rs.getBlob("Binary_Photo");
// setup the streams
Input = image.getBinaryStream();
try {
// 设置写出路径。
output = new FileOutputStream(dir);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
// set read buffer size 注意不要设置的太小,要是太小,图片可能不完整
byte[] rb = new byte[1024000];
int ch = 0;
// process blob
try {
// 写入本地文件系统
while ((ch = input.read(rb)) != -1) {
output.write(rb, 0, ch);
}
} catch (IOException e) {
e.printStackTrace();
}
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
finally {
try {
rs.close();
pre.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
[@more@]
文件
数据
进制
图片
存储
数据库
普通
代码
大小
类型
系统
处理
输出
不同
图形
字段
字符
字符串
对象
情况
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中百多点的软件开发
网络安全周哪个领导会出席
实惠的网络安全防范
服务器配置文件安全
软件开发技术贸易合同文本
乡镇网络安全主体责任制
中国工商银行杭州软件开发
扬州江苏服务器服务商云主机
郑州软件开发定制怎样收费
怎么快速建立数据库的表
昆仑服务器
微博服务器炸了程序猿结婚
服务器指标参数
为什么cf进游戏服务器都是黑色
上饶哪里招聘网络安全员
中央网信办副主任网络安全论坛
北京服务器运维公司云主机服务器
棒的app软件开发
数据库中什么是完整性
安徽运营软件开发哪个好
我的世界国际版生存模组服务器
delphi 文件服务器
网络安全管理工程师初级
如何制作一个好玩的服务器
华为网络安全声明
将html导入到数据库中
直播网络安全与维护专业
数据库的限定词
党内统计数据库连接
服务器管理ip地址在哪里