struts2上传图片

来源:互联网 发布:sql语句having 编辑:程序博客网 时间:2024/05/21 10:33

 

一、首先把数据库和表建立好,然后把框架搭好如:导入struts2的各个包和mysql的驱动包(共8个包)再把连接数据库的类写好。

二、用jsp上传照片到数据库以及显示到页面的步骤:

1.上传页面如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>

 </head>

 <body>
  <form action="fileUpload" method="post" enctype="multipart/form-data">
   图片路径:
   <input type="file" name="file">
   <input type="submit" value="上传">
   <input type="reset" value="重置">
  </form>
 </body>
</html>

 

2.Picture类如下(依赖注入的方式:set&get方法):

 

package cn.ichain.bean;

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

 

 

.好了,可以写Dao层了我比较懒用action层直接拿Dao层的数据了,中间忽略了service层。

 

3.向数据库里插入图片路径如下:

 

package cn.ichain.service;

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 cn.ichain.bean.Picture;
import cn.ichain.comm.GetConnection;

public class FileUploadService {
//  /**
   /** 上传图片到数据库
   * @param flie
   * @return boolean
   *         上传是否成功
   */
  public boolean fileUpload(File flie) {
   //FileInputStream 可以对文件读取流的操作
   FileInputStream in = null;
   Connection conn = null;
   PreparedStatement ps = null;
   try {
    //把文件流读取
    in = new FileInputStream(flie);
    //把图片路径插入到数据库里
    String sql = "insert into savepic(picture) value(?)";
    conn = GetConnection.getConn();
    ps = conn.prepareStatement(sql);
   // 将指定in设置为指定的输入流 inputStream.available()用来判断流的长度
    ps.setBinaryStream(1, in, in.available());
    //如果有数据库就返回true
    if (ps.executeUpdate() > 0) {

     return true;
    } else {

     return false;
    }
   } catch (Exception e) {

    e.printStackTrace();

    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 {
    //查询全部id
    String sql = "select id from savepic";
    conn = GetConnection.getConn();
    ps = conn.prepareStatement(sql);
    rs = ps.executeQuery();
    while (rs.next()) {
     pic = new Picture();
     pic.setId(rs.getInt("id"));
     list.add(pic);
    }
   } catch (Exception e) {
    e.printStackTrace();
  
   }
   return list;
  }

  /**
   * 根据图片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 savepic 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);
    }
   } catch (Exception ex) {
    ex.printStackTrace();
   }
   return is;
  }

 }

 

4.写FileUploadAction类上传图片:

 

package cn.ichain.action;

import java.io.File;
import java.util.List;

import cn.ichain.bean.Picture;
import cn.ichain.service.FileUploadService;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;


public class FileUploadAction extends ActionSupport{
 //serialVersionUID 用来表明类的不同版本间的兼容性
  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() {
  
   //service层
   FileUploadService fuservice=new FileUploadService();
   System.out.println("文件:"+file);
   //如果图片上传成功
   if(fuservice.fileUpload(file)){
  
    //查询所有图片
    List<Picture> list=fuservice.findAll();
    ActionContext cxt=ActionContext.getContext();
    //就查询全部图片把查询出来的图片保存到一个ActionContext里面,以便在显示页面显示图片
    cxt.put("list",list);
    return SUCCESS;
   }else{
    //如果图片上传失败就提示上传失败
    super.addActionError(this.getText("fileupload.fail"));
    return INPUT;
   }
  }
 }


5.写OutPictureAction类作为图片输出:

 

package cn.ichain.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 cn.ichain.service.FileUploadService;

import com.opensymphony.xwork2.ActionSupport;

public class OutPictureAction extends ActionSupport{

 /**
  * 图片输出
  * @author closewubq
  *
  */
 
  private static final long serialVersionUID = 1L;    
  @Override
  public String execute() throws Exception {
     HttpServletRequest request = ServletActionContext.getRequest();
     //取到显示页面传过来的id
     int id=Integer.parseInt(request.getParameter("id"));
     //service层
     FileUploadService service=new FileUploadService();
     //根据id获取流对象
     InputStream in=service.getPicById(id);
     HttpServletResponse response=ServletActionContext.getResponse();
     //不使用编码处理文件流的情况
     response.setContentType("image/gif");
     //如果服务器发来的字节流没有任何标记,只是在发完一次数据后刷新,则在客户可以用inputStream.available()来判断流的长度。(注:一定要在调用read()至少一次之后,否则为零值)
     //inputStream.available()用来判断流的长度
     int size=in.available();
     //把流的长度放到一个byte数组里面
     byte[] image=new byte[size];
     //读出数据库里面的图片
     in.read(image);
     //servletOutputStream用来传输数据
     ServletOutputStream out=response.getOutputStream();
     //再把图片写入到显示页面
     out.write(image);
     return null;
  }
 }

 

6.成功页面是用于显示已上传的图片的页面如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
 String path = request.getContextPath();
 String basePath = request.getScheme() + "://"
   + request.getServerName() + ":" + request.getServerPort()
   + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- 显示图片页面 -->
<html>
 <head>
  <base href="<%=basePath%>">
 </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>


7.配置struts.xml如下:

 

<?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>

 <package name="default" extends="struts-default" namespace="/">
  <!--上传-->
  <action name="fileUpload"
   class="cn.ichain.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">/index.jsp</result>
  </action>
  <!--输出显示-->
  <action name="outPicture"
   class="cn.ichain.action.OutPictureAction">
   <result name="input">/uploadSuccess.jsp</result>
  </action>
 </package>
</struts>

 

注:mysql数据库存放图片路径的类型应该是longbolb类型,因为路径太长了。

原创粉丝点击