设为首页 收藏本站
查看: 1215|回复: 0

[经验分享] DB2保存图片并读取动态显示图片

[复制链接]

尚未签到

发表于 2016-11-18 04:20:45 | 显示全部楼层 |阅读模式
  博文背景:
  客户要求结构化图片信息,而不是文件文档话的管理,故要求将图片信息存储于DB2里,出于技术的角度,真不喜欢将文件存储于数据库,
  但客户是上帝,木有办法,故有了如下的测试。
  测试环境:DB2 V9.7  JDK7  spring3.x tomcat8
  本机测试结果:在第一次访问的时候动态获取的速度是直接获取的1/20的样子,如果缓存的话就无法对比了。
  时间检测使用了chrome和firfox的F12工具。
  写测试代码的过程中参考了网上很多文章,发现大部分都是copy来copy去,估计都没去测试过十分能行的通。
  这里记录一下测试过程中遇到的麻烦吧
  1、DB2保存的时候数据库是Blob类型,java里设置成byte[]才能正常保存(BinaryStream和Blob均失败).
  2、读取DB2的Blob的时候不知道为何使用PreparedStatement读取不出来,使用Statement才行。
  3、IO的操作比较生疏了。
  表结构:
DSC0000.jpg


1、保存图片
  上传图片的页面:



<form action="bs/test/uploadImg.do" method="post" enctype="multipart/form-data" target="testFrame">
ID:<input type="text" name="id"/><br />
名字:<input name="name" type="text"/><br />
文件:<input type="file" name="img"/><br />
<input type="submit" value="提交"/>
</form>
<iframe src="" id="testFrame" name="testFrame" height="0" width="0" frameborder="0"></iframe>
  后台action示例:



import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.oreilly.servlet.multipart.FilePart;
import com.oreilly.servlet.multipart.MultipartParser;
import com.oreilly.servlet.multipart.ParamPart;
import com.oreilly.servlet.multipart.Part;   
@Urls("uploadImg.do")
@Ajax
public void saveFile(HttpServletRequest request){
int fileSize = 10;
try {
MultipartParser mp = new MultipartParser (request, fileSize * 1024 * 1024 );
Part part;
int fileCount = 0;
byte[] bt = null;
String name = null;
String fileName = null;
String id = "999";
//遍历请求中的所有表单
while((part=mp.readNextPart())!=null){
if(part.isFile()){//是文件
FilePart fp = (FilePart)part;
fileName = fp.getFileName();
if (fileName.endsWith("png") || fileName.endsWith("gif") || fileName.endsWith("jpg") || fileName.endsWith("jpeg")) {
//输出流的目的是将输入流转成byte数组
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = fp.getInputStream();
int size = 0;
byte[] buffer = new byte[1024];
while((size=in.read(buffer))!=-1){
out.write(buffer, 0, size);
}
bt = out.toByteArray();
fileCount++;
}else {
throw new Exception("文件不是图片!");
}
}else{
ParamPart pp = (ParamPart)part;
String inputName = pp.getName();
if("name".equals(inputName)){
name = pp.getStringValue();
}else if("id".equals(inputName)){
id = pp.getStringValue();
}
}
}
if(fileCount==0){
throw new Exception("请选择图片后再上传!");
}
this.testDao.saveFile(fileName, bt, name,Integer.parseInt(id));
} catch (Exception e) {
e.printStackTrace();
}
}
  dao方法:



public void saveFile(final String fileName,final byte[] bt,final String name,final int id) throws SQLException{
String sql = "insert into SDE.T_TEST_IMG(ID,FILE_NAME,IMG_FILE,NAME) VALUES(?,?,?,?)";
this.getJdbcTemplate().update(sql, new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setInt(1, id);
ps.setString(2, fileName);
//下面这2种都会报错,网上一大堆例子都是这么写的,很诧异..............
//ps.setBinaryStream(3, fis, fileSize);
//ps.setBlob(3, fis);
ps.setBytes(3, bt);
ps.setString(4, name);
}
});
}

2、读取图片
  前台:



<input type="button" onclick="setUrl()" value="加载图片"/>
<img src="" alt="动态生成" id="dImg"/>
<img src="" alt="直接获取" id="sImg"/>
  js:



function setUrl(){
//动态生成同样的图片
document.getElementById("dImg").src="generationImg?id=3";
//直接访问图片
document.getElementById("sImg").src="mobileImage/17074_20130927160025.jpg";
}
  处理生成图片的servlet:



/**
* 从数据库里读取Blob类型的图片并显示给前台
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter("id");
response.setContentType("image/jpeg");
TestDao testDao = (TestDao)WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()).getBean(TestDao.class);
InputStream ins = null;
try {
ins = testDao.loadFile(id);
} catch (SQLException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
}
//从输入流构建图片
BufferedImage image = null;
image = ImageIO.read(ins);
ServletOutputStream out = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
ins.close();
out.flush();
out.close();
}
  dao方法:



/**
* 读取DB2的blob字段并转换成流
* @param id
* @return
* @throws SQLException
*/
public InputStream loadFile(String id) throws SQLException{
String sql = "select IMG_FILE from SDE.T_TEST_IMG where ID="+id;
InputStream ins = null;
Connection con = this.getJdbcTemplate().getDataSource().getConnection();
Statement ps = con.createStatement();
ResultSet rs = ps.executeQuery(sql);
while(rs.next()){
Blob blob = rs.getBlob("IMG_FILE");
ins = blob.getBinaryStream();
}
return ins;
//下面这个写法会有问题,而且上面那个Statement改成PrepareStatement后也获取不到值,ResultSet是null
/*
InputStream ins = this.getJdbcTemplate().execute(sql, new PreparedStatementCallback() {
public Object doInPreparedStatement(PreparedStatement ps)
throws SQLException, DataAccessException {
ResultSet rs = ps.getResultSet();
Blob blob = rs.getBlob(1);
InputStream ins = blob.getBinaryStream();
return ins;
}
});
return ins;*/
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301733-1-1.html 上篇帖子: 初用DB2 UDB V8.2(Stinger)制作CLR存储过程 下篇帖子: db2游标的一些注意.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表