上传图片并保存到数据库

seam给我们提供了 s:fileUpload 标签以完成文件上传功能.使用该标签时,要在web.xml中声明一个Seam的过滤器:
<filter>
<filter-name>Seam Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
</filter> <filter-mapping>
<filter-name>Seam Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

s:fileUpload 标签主要属性:

  • data: 需绑定一个byte[] 数组,用来接收上传的二进制数据.
  • fileName: 上传文件的文件名
  • accept: 允许上传的文件类型,可取 "images/png", "images/jpg".
用法示例:

<h:form enctype="multipart/form-data" id="upload-form">
<s:fileUpload data="#{memberHome.instance.avator}" fileName="#{memberHome.fileName}" />
<h:commandButton value="上传照片" action="#{memberHome.update()}"
styleClass="btn btn-primary btn-small">
</h:commandButton>
</h:form>

这里 avator 是一个byte[]数组,fileName是一个String对象.
注意必须在form中使用 "multipart/form-data" 的编码类型.

当用户选择好图片,点击"上传照片"后,图片数据会首先被保存到Member实体Bean中的avator属性中,随后memberHome的update()方法被调用,JPA会把avator中的数据持久化到数据库中.

从数据库中读出图片并在页面中显示

要显示图片,可以使用<img>标签.但由于图片是保存在数据库中的,所以无法用将img的src属性设置为图片路径的方式来显示图片.这时候我们可以使用Servlet来完成这一功能.即将src指向一个Servlet,由这个Servlet负责把图片从数据库中取出并返回.

要在Servlet中访问数据数,可以先通过JNDI查询返回一个DataSource(数据源),通过DataSource的getConnection()方法来建立与数据库的连接,即使用JDBC访问数据库.
JNDI查询方法如下:
private DataSource getDS() throws NamingException {
Context context = new InitialContext();
return (DataSource) context.lookup("zhiduiDatasource");
}

lookup()中要传递你要查询的对象的名称,即在persistence.xml中<jta-data-source>节点所声明的数据源.有关JNDI的详细说明,参见Oracle官方指南:
http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/


之后就可以从数据库中读出图片数据了:
private void getImageByte() {
DataSource ds = null;
Connection conn = null; try {
ds = getDS();
conn = ds.getConnection();
Statement stat = conn.createStatement();
ResultSet res = stat.executeQuery("select * from member where id='" + memberId + "'"); while(res.next()) {
imageByte = res.getBytes("avator_file");
} } catch(SQLException ex) {
ex.printStackTrace();
} catch(NamingException ex) {
ex.printStackTrace();
} finally {
try {
conn.close();
} catch(SQLException ex) {
ex.printStackTrace();
}
} }

最后在doGet()方法中将读出的byte[]数据返回:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String parm = req.getParameter("memberId");
memberId = Integer.parseInt(parm); getImageByte();
resp.getOutputStream().write(imageByte, 0, imageByte.length);
}

别忘了在web.xml中声明你的ImageServer并配置URL映射:

<servlet>
<servlet-name>Image Servlet</servlet-name>
<servlet-class>cn.edu.sudt.zhidui.servlet.ImageServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>Image Servlet</servlet-name>
<url-pattern>*.showimg</url-pattern>
</servlet-mapping>

这时使用<img>标签就能成功地将图片显示到页面中了.

<img src="asd.showimg?memberId=#{memberHome.instance.id}" />

用Seam实现:图片上传 + 保存到数据库 + 从数据库读出图片并显示到页面中的更多相关文章

  1. kindeditor扩展粘贴图片功能&修改图片上传路径并通过webapi上传图片到图片服务器

    前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功 ...

  2. kindeditor扩展粘贴截图功能&修改图片上传路径并通过webapi上传图片到图片服务器

    前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功 ...

  3. html + js 实现图片上传,压缩,预览及图片压缩后得到Blob对象继续上传问题

    先上效果 上传图片后(设置了最多上传3张图片,三张后上传按钮消失) 点击图片放大,可以使用删除和旋转按钮 (旋转功能主要是因为ios手机拍照后上传会有写图片被自动旋转,通过旋转功能可以调正) html ...

  4. 本地图片上传到GitHub,MarkDown使用Github图片地址

    最近在学习用markdown编辑器,我是直接用有道云笔记编辑的,感觉真的好好用,编辑了一半的博客,可以按样式保存在云笔记中,我再也不会忘记写博客了~~ 但是在编辑博客的时候发现了一个问题,那就是本地图 ...

  5. Thinkphp5+plupload图片上传功能,支持实时预览图片。

    今天和大家分享一个国外的图片上传插件,这个插件支持分片上传大文件.其中著名的七牛云平台的jssdk就使用了puupload插件,可见这个插件还是相当牛叉的. 这个插件不仅仅支持图片上传,还支持大多数文 ...

  6. vue 实现图片上传与预览,以及清除图片

    vue写原生的上传图片并预览以及清除图片的效果,下面是demo,其中里面有vue获取input框value值的方法以及vue中函数之间的调用 <!DOCTYPE html> <htm ...

  7. ssm框架实现图片上传显示并保存地址到数据库

    本案例是通过springmvc+spring+mybatis框架以商品上传为例,实现的图片上传功能,并把图片的地址保存到数据库并在前台显示上传的图片. 本项目是使用maven搭建的项目,首先看下项目结 ...

  8. JS图片上传预览插件制作(兼容到IE6)

    其实,图片预览功能非常地常见.很意外,之前遇到上传图片的时候都不需要预览,也一直没有去实现过.现在手上的项目又需要有图片预览功能,所以就动手做了一个小插件.在此分享一下思路. 一.实现图片预览的一些方 ...

  9. springMVC框架下——通用接口之图片上传接口

    我所想要的图片上传接口是指服务器端在完成图片上传后,返回一个可访问的图片地址. spring mvc框架下图片上传非常简单,如下 @RequestMapping(value="/upload ...

随机推荐

  1. Frameset布局

    <FRAMESET> <FRAME> <NOFRAMES> <IFRAME> ■ 框架概念 : 所谓框架便是网页画面分成几个框窗,同时取得多个 URL. ...

  2. jQuery 个人随笔

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. ToString函数用法

    // C 货币    2.5.ToString("C"); // ¥2.50    // D 10进制数    25.ToString("D5"); // 25 ...

  4. jquery fancybox ie6无法显示关闭按钮

    解决办法: 打开jquery.fancybox-1.3.4.css 注释掉这行就行了: .fancybox-ie6 #fancybox-close { background: transparent; ...

  5. MyEclipse使用经验总结

    0.快捷键 ================================================================================ 编辑: Ctrl+Shif ...

  6. hadoop Yarn 编程API

    客户端编程库: 所在jar包: org.apache.hadoop.yarn.client.YarnClient 使用方法: 1 定义一个YarnClient实例: private YarnClien ...

  7. ios7新特性3-Map Kit新特性

    Map Kit 框架 (MapKit.framework) 包含了大量的改进以及为基于地图的程序提供了新特性.利用地图显示位置信息的应用现在可以使用Maps这个程序用到的3D地图,包括控制程序控制视线 ...

  8. The Lost Art of C Structure Packing

    对齐要求 首先需要了解的是,对于现代处理器,C编译器在内存中放置基本C数据类型的方式受到约束,以令内存的访问速度更快. 在x86或ARM处理器中,基本C数据类型通常并不存储于内存中的随机字节地址.实际 ...

  9. 在线浏览pdf文件,pdfobject的简单使用

    该js插件,官网有详细的使用教程(网址:http://www.pdfobject.com/examples/).打开里面的例子后,查看新打开页面,打开并查看该页面的源代码. 需要的材料: 1.PDFo ...

  10. 计算字符串的最长回文子串 :Manacher算法介绍

    转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ...