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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

数据库的创建:

数据库名叫: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好了我们该启动看看效果了:






      本文转自yjflinchong 51CTO博客,原文链接:http://blog.51cto.com/yjflinchong/1165113,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
XML SQL JavaScript
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
这篇文章介绍了如何在Vue页面中结合SpringBoot、MyBatis、ElementUI和ECharts,实现从数据库获取数据并展示为图表的过程,包括前端和后端的代码实现以及遇到的问题和解决方法。
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
|
7月前
|
关系型数据库 MySQL 数据库
生成订单的过程------支付系统21------支付宝支付----统一收单下单并支付页面接口----创建订单,下订单,我们要在我们数据库的订单表中,设置订单,订单表常用数据库设置格式
生成订单的过程------支付系统21------支付宝支付----统一收单下单并支付页面接口----创建订单,下订单,我们要在我们数据库的订单表中,设置订单,订单表常用数据库设置格式
|
8月前
|
Java Devops API
阿里云云效操作报错合集之云效页面提示数据库保存不进去,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
8月前
|
JSON 前端开发 JavaScript
SSMP整合案例第五步 在前端页面上拿到service层调数据库里的数据后列表
SSMP整合案例第五步 在前端页面上拿到service层调数据库里的数据后列表
62 2
|
8月前
|
关系型数据库 MySQL 项目管理
数据库大作业——基于qt开发的图书管理系统(四)项目目录的整理与绘制登录页面
数据库大作业——基于qt开发的图书管理系统(四)项目目录的整理与绘制登录页面
|
9月前
|
存储 关系型数据库 MySQL
AnalyticDB MySQL新购页面融合升级,提供企业版购买选项
AnalyticDB MySQL新购页面升级,现推出企业版和基础版,不再区分湖仓版和数仓版。企业版(集群模式)和基础版(单机模式)融合了弹性模式和预留模式的功能,提供资源隔离、弹性扩展及高性能查询,适合开发测试和生产环境,而基础版适用于小规模测试,不推荐用于生产环境。
AnalyticDB MySQL新购页面融合升级,提供企业版购买选项
|
9月前
|
SQL 分布式计算 关系型数据库
云原生数据仓库产品使用合集之可以把ADB MySQL湖仓版数据库做成页面查询的数据库吗
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
9月前
|
Devops API 项目管理
云效常见问题之页面提示数据库保存不进去如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
|
9月前
|
算法 关系型数据库 API
Python【算法中心 02】Web框架Django管理页面使用(管理员账号创建+API使用+应用添加)GreenPlum数据库引擎及API测试
Python【算法中心 02】Web框架Django管理页面使用(管理员账号创建+API使用+应用添加)GreenPlum数据库引擎及API测试
133 0
|
关系型数据库 MySQL Apache
【XAMPP】中mysql的admin页面打不开
【XAMPP】中mysql的admin页面打不开

热门文章

最新文章