代码改变世界

Struts2上传图片到Mysql数据库中,以及显示到页面

2010-10-14 16:30  javaspring  阅读(230)  评论(0编辑  收藏  举报

数据库的创建:

数据库名叫:csdn

表名:savepicture

DROP TABLE IF EXISTS `savepicture`;
CREATE TABLE `savepicture` (
  `id` int(10) NOT NULL auto_increment,
  `picture` blob NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

好动手创建工程啦:

 

其实非常简单,一看就明白。把需要的包该导的都导了就行了。

接着我们创建上传页面:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <title>File Upload</title>
  <link href="<%=request.getContextPath()%>/css/fileupload.css"
   rel="stylesheet" type="text/css">
 </head>
 <body bgcolor="#cccccc">
  <div style="padding-top: 30px; padding-left: 30px">
   <fieldset
    style="width: 600px; border-color: #000000; padding-left: 10px">
    <legend>
     <font size="-1" color="#000000"><b>上传图片</b> </font>
    </legend>
    <div class="ErrorDiv">
       <s:fielderror/>
     <s:actionerror/>
    </div>
    <s:form action="fileUpload.action" method="post" theme="simple"
     enctype="multipart/form-data">
     <table border="1" width="500px">
      <tr>
       <td class="tableTDCenter">
        图片路径:
       </td>
       <td class="tableTDCenter">
        <s:file name="file" cssClass="fileInput"/>
       </td>
      </tr>
      <tr>
       <td class="tableTDCenter" colspan="2">
        <s:submit value="提交" cssClass="button"></s:submit>
       </td>
      </tr>
     </table>
    </s:form>
   </fieldset>
  </div>
 </body>
</html>

很简单,就是个上传框和按钮,别的没有了。至于一些css就是稍微的装饰装饰,一会也在下面写上!

上传成功的画面:

 <%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Image List</title> <link href="<%=request.getContextPath()%>/css/fileupload.css" rel="stylesheet" type="text/css"> </head> <body> <s:iterator value="#list" id="picture"> <div class="divfloat"> <img src='outPicture.action?id=<s:property value ="#picture.id"/>'> </div> </s:iterator> </body> </html>

 

下面我们看看struts2的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
 <constant name="struts.custom.i18n.resources"
  value="messageResource" />
 <constant name="struts.i18n.encoding" value="UTF-8" />
 <package name="default" extends="struts-default">
     <!--上传-->
  <action name="fileUpload"
   class="org.csdn.action.FileUploadAction">
   <interceptor-ref name ="defaultStack" />
   <interceptor-ref name ="fileUpload">
                <param name ="allowedTypes">
                    image/bmp,image/png,image/gif,image/jpg
                </param>
                <param name="maximumSize">404800</param>
            </interceptor-ref>
   <result name="success">/uploadSuccess.jsp</result>
   <result name="input">/fileUpload.jsp</result>
  </action>
   <!--输出显示-->
  <action name="outPicture"
   class="org.csdn.action.OutPictureAction">
   <result name="input">/uploadSuccess.jsp</result>
  </action>
 </package>
</struts>

至于里面的东西是什么,大家肯定根据名字一看就知道了。

上面我引用了messageResource资源文件,为了显示错误消息。比如上传类型不正确,超过大小,以及上传失败。

下面就是资源文件中的内容。

struts.messages.error.content.type.not.allowed=The file you uploaded is not a image
struts.messages.error.file.too.large=this picutre is too large
fileupload.fail=file upload is fail

如果没有重新定义上面两个key的话,显示的会是struts2默认的错误消息,很是难看,也乱起八糟的。所以我重新定义了。

接着我们就开始写上传和输出图片的action,以及相关的类信息

上传的action:

import java.io.File;
import java.util.List;
import org.csdn.service.FileUploadService;
import org.csdn.vo.Picture;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
 * @author closewubq
 */
public class FileUploadAction extends ActionSupport {
 private static final long serialVersionUID = 1L;
 private File file;
 public File getFile() {
  return file;
 }
 public void setFile(File file) {
  this.file = file;
 }
 /**
  * 上传文件
  */
 @Override
 public String execute() {
  FileUploadService fuservice=new FileUploadService();
  if(fuservice.fileUpload(file)){
   List<Picture> list=fuservice.findAll();
   ActionContext cxt=ActionContext.getContext();
   cxt.put("list",list);
   return SUCCESS;
  }else{
   super.addActionError(this.getText("fileupload.fail"));
   return INPUT;
  }
 }
}

非常简单,因为我只单纯的用了struts2,没有用spring。所以FileUploadService就硬编码写在里面了。、

图片上传的主要业务类

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.csdn.connection.GetConnection;
import org.csdn.vo.Picture;
/**
 * @author closewubq
 */
public class FileUploadService {

 /**
  * 上传图片到数据库
  * @param flie
  * @return boolean
  *         上传是否成功
  */
 public boolean fileUpload(File flie) {
  FileInputStream in = null;
  Connection conn = null;
  PreparedStatement ps = null;
  try {
   in = new FileInputStream(flie);
   String sql = "insert into savepicture(picture) value(?)";
   conn = GetConnection.getConn();
   if (conn == null) {
    System.out.println("连接为null");
    return false;
   }
   ps = conn.prepareStatement(sql);
   ps.setBinaryStream(1, in, in.available());
   if (ps.executeUpdate() > 0) {
    GetConnection.close(conn, ps, null);
    return true;
   } else {
    GetConnection.close(conn, ps, null);
    return false;
   }
  } catch (Exception e) {
   System.out.println(e.getMessage());
   GetConnection.close(conn, ps, null);
   return false;
  }
 }

 /**
  * 检索所有图片
  * @return list
  *        返回所有图片记录
  */
 public List<Picture> findAll() {
  List<Picture> list = new ArrayList<Picture>();
  Picture pic = null;
  Connection conn = null;
  PreparedStatement ps = null;
  ResultSet rs = null;
  try {
   String sql = "select id from savepicture";
   conn = GetConnection.getConn();
   if (conn == null) {
    System.out.println("连接为null");
    return null;
   }
   ps = conn.prepareStatement(sql);
   rs = ps.executeQuery();
   while (rs.next()) {
    pic = new Picture();
    pic.setId(rs.getInt("id"));
    list.add(pic);
   }
   GetConnection.close(conn, ps, rs);
   return list;
  } catch (Exception e) {
   e.printStackTrace();
   GetConnection.close(conn, ps, rs);
   return null;
  }

 }

 /**
  * 根据图片ID获取流对象
  * @param id
  * @return InputStream
  */
 public InputStream getPicById(int id) {
  Connection conn = null;
  PreparedStatement ps = null;
  ResultSet rs = null;
  InputStream is = null;
  try {
   String sql = "select picture  from savepicture where id=?";
   conn = GetConnection.getConn();
   ps = conn.prepareStatement(sql);
   ps.setInt(1, id);
   rs = ps.executeQuery();
   if(rs.next()){
    is = rs.getBinaryStream("picture");
    GetConnection.close(conn, ps, rs);
    return is;
   }
   GetConnection.close(conn, ps, rs);
   return null;
  } catch (Exception ex) {
   ex.printStackTrace();
   GetConnection.close(conn, ps, rs);
   return null;
  }
 }

}

简单的写了个jdbc链接的获取类。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * 获取数据库链接
 * @author closewubq
 */
public class GetConnection {
 
 /**
  * 获取数据库连接
  * @return Connection
  *         返回数据库连接
  */
 public static Connection getConn() {
  try {
   Class.forName("com.mysql.jdbc.Driver").newInstance();
   String url = "jdbc:mysql://localhost/csdn?user=root&password=";
   Connection connection = DriverManager.getConnection(url);
   return connection;
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
 }
 
 /**
  * 关闭连接释放资源
  * @param conn
  * @param rs
  * @param st
  */
 public static void close(Connection conn,PreparedStatement ps,ResultSet rs){
  if(rs!=null)
   try {
    rs.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  if(ps!=null)
   try {
    ps.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  if(conn!=null)
   try {
    conn.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
 
 }

}

还有保存图片信息的VO


public class Picture {
 private int id;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
}

输出图片信息的Action

import java.io.InputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.csdn.service.FileUploadService;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 图片输出
 * @author closewubq
 *
 */
public class OutPictureAction extends ActionSupport {
 private static final long serialVersionUID = 1L;    
 @Override
 public String execute() throws Exception {
    HttpServletRequest request = ServletActionContext.getRequest();
    int id=Integer.parseInt(request.getParameter("id"));
    FileUploadService service=new FileUploadService();
    InputStream in=service.getPicById(id);
    HttpServletResponse response=ServletActionContext.getResponse();
    response.setContentType("image/gif");
    int size=in.available();
    byte[] image=new byte[size];
    in.read(image);
    ServletOutputStream out=response.getOutputStream();
    out.write(image);
    return null;
 }
}

over,over好了我们该启动看看效果了: