使用Struts2上传图片存取到Mysql中并读取出来显示在页面上
Google 标签: 李顺利;Struts;图片;存取;存入;显示;Mysql;数据库;Blob
索引
索引... 1
关键词... 1
序... 2
准备工作... 2
开发环境... 3
流程和主要代码... 3
创建数据库... 3
整合SSH.. 4
主要代码(知识)... 5
程序截图... 12
分享和下载... 14
关键词
李顺利,Struts,图片,存取,存入,显示,Mysql,数据库,Blob,
序
实际上,写完多文件上传和下载文章的时候,类似的想法就已经有了,一直没有实际把它整理好,今天也终于把这方面的一些经验分享给大家了。
本文涉及到的需求(功能点)大致有:
1. 如何上传图片,并把图片存入数据库(Mysql)中;
2. 从数据库中读取图片并显示在页面中
注:本文使用的是单纯的Struts2 + Spring + Hibernate,图片操作并没有使用Servlet。
准备工作
本文全部使用Annotation来整合SSH,运用了文件上传和表单验证等知识,这些知识都可以在我以前写的博文中获取到,包括
1. Struts2下多文件的上传与下载
http://www.blogjava.net/lishunli/archive/2010/01/07/308614.html
2. 使用Annotation并对DAO层封装具有分页功能的S2SH整合实例
http://www.blogjava.net/lishunli/archive/2010/03/10/315055.html
http://www.blogjava.net/lishunli/archive/2010/03/12/315231.html
3. 如何自定义Struts2表单验证后的错误信息显示格式/样式
http://www.blogjava.net/lishunli/archive/2010/10/17/335384.html
http://www.blogjava.net/lishunli/archive/2010/01/07/308609.html
如果大家对上面的知识有所欠缺的话和想学习的话,也请大家Google或者看我的blog。谢谢。
开发环境
Struts 2.1.8.1 + Hibernate3 + Spring3+ Mysql5 + Tomcat 7.0.2+ Myeclipse 8.6
流程和主要代码
创建数据库
本文会使用User对象(包括username、password、picture等属性),对应Mysql数据库的创建脚本如下:
/* Source Server : Local Source Server Version : 50140 Source Host : localhost:3306 Source Database : test
Target Server Type : MYSQL Target Server Version : 50140 File Encoding : 65001
Date: 2010-11-13 23:23:37 */
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(100) NOT NULL AUTO_INCREMENT, `username` varchar(100) NOT NULL, `password` varchar(100) NOT NULL, `picture` longblob, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8; |
(请注意pictrue的类型)
整合SSH
这个步骤请参考使用Annotation并对DAO层封装具有分页功能的S2SH整合实例。
主要代码(知识)
1、 User 类
实际上很简单,写出来,主要是让大家知道这里面图片是使用的是什么类型
@Entity @Table(name = "user", catalog = "test") public class User implements java.io.Serializable { private static final long serialVersionUID = 4230186551226007292L;
private Integer id; private String username; private String password; private Blob picture;
/** * 省略构造方法和set、get方法 */
} |
2、 AddUserAction类
在add user action,就是真正的把User对象(包括图像)save到Mysql中。其中这里使用了Struts2的Annotation,请注意 InterceptorRefs 中 params 的写法。
关键的代码也就是使用hibernate的createBlob方法来把File类型转换成Blob类型。
Blob blob = Hibernate.createBlob(..)
@Controller @Scope("prototype") @Results( { @Result(name = "success", location = "/index.jsp"), @Result(name = "input", location = "addUser.jsp") }) @InterceptorRefs(value = { @InterceptorRef(value = "fileUpload", params = { "maximumSize", "1048576", "allowedTypes","image/bmp,image/x-png,image/png,image/gif,image/jpeg,image/jpg,image/pjpeg" }), @InterceptorRef(value = "defaultStack") }) public class AddUserAction extends ActionSupport { private static final long serialVersionUID = -4829467290275994251L;
private User user; private File image;
@Resource(name = "org.usc.services.userService") private IUserService userService;
/** * 省略 set、get方法和validate验证 */
@Override public String execute() throws Exception { if (image != null) { FileInputStream fin = new FileInputStream(image);// File 转 InputStream Blob blob = Hibernate.createBlob(fin);// InputStream 转 Blob user.setPicture(blob); }
userService.save(user);
return SUCCESS; } } |
3、 addUser.jsp
这个就是一个普通的Input界面,很简单。想说一下,这里使用了表单验证后信息显示的技术,详情请见如何自定义Struts2表单验证后的错误信息显示格式/样式,也请注意这里使用了文件上传控件,所以要设置enctype="multipart/form-data"。
<s:form action="add-user" method="post" theme="simple" enctype="multipart/form-data"> UserName<s:textfield name="user.username"></s:textfield> <font color="red"> *<s:property value="fieldErrors['user.username'][0]" /> </font> <br>
PassWord<s:password name="user.password"></s:password> <font color="red"> *<s:property value="fieldErrors['user.password'][0]" /> </font> <br>
Image<s:file |