上传图片并保存到数据库

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. Java之字符串学习

    java中String的使用十分频繁,是我们要学习的重点,在说String之前,我们要知道堆跟栈的区别. java中的数据类型分原生数据类型(primitived types)有八种(byte,cha ...

  2. /etc/fstab一些信息

    [root@shine shine]# vim /etc/fstab ## /etc/fstab# Created by anaconda on Thu May 9 13:29:35 2013## A ...

  3. 配置并学习微信JS-SDK(2)—图片接口

    测试地址:http://www.qq210.com/shoutu/android 检查图像接口 选择本地或拍照的图片 上传选择的图片 预览上传的图片 //1.检查图像接口 document.query ...

  4. python包管理器pip

    步骤一:下载pip包 https://pypi.python.org/pypi/pip 步骤二:安装pip包 解压后,到pip包目录执行: python setup.py install 步骤三:添加 ...

  5. 一个简单的webservice调用

    我们先创建一个简单空web应用程序 然后添加新建项目 //我们创建一个peson对象,产生数据标识返回 using System; using System.Collections.Generic; ...

  6. BASLER 镜头选型白皮书

    本文翻译自Basler镜头选型白皮书 有许多方法来进行镜头选型.本文将会讨论其中的指导原则,以帮助你在项目中选择合适的镜头.我们将讨论许多镜头的基本概念,比如镜头接口.图像大小.放大率.焦距.F数和光 ...

  7. JS模块加载器加载原理是怎么样的?

    路人一: 原理一:id即路径 原则.通常我们的入口是这样的: require( [ 'a', 'b' ], callback ) .这里的 'a'.'b' 都是 ModuleId.通过 id 和路径的 ...

  8. 【关于JavaScript】自动计算的实例

    在一些贸易业务Web系统中,某些页面需要提供实时的辅助计算功能,例如:员工录入货物的单价和数量的值,通过JavaScript的事件处理可以直接显示出总价. 如下图所示就是本例的运行效果图: 本例中也采 ...

  9. 消息队列msmq

    http://q.cnblogs.com/q/26895/ 远程队列必须现在运程服务器上创建. 在 Windows Server 2008 上安装 IIS 服务和 MSMQ 功能后,系统会在 IIS  ...

  10. jquery学会的

    1.$("#id")    $("xxxxx") (input, body) $(".class") 2. $("#id  xxx ...