Struts2(八.添加用户多张照片实现文件上传功能)

Posted 塔卡哈西KSK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2(八.添加用户多张照片实现文件上传功能)相关的知识,希望对你有一定的参考价值。

1.modify.jsp

在modify.jsp修改用户信息页面实现文件上传,添加用户照片的功能

如果是文件上传,method必须是post,必须指定enctype

<form method="post" enctype="multipart/form-data">

代码:

上传照片
<br>
<br>
<!-- 照片上传,可以上传多个文件 -->
<form method="post" enctype="multipart/form-data" action="${pageContext.request.contextPath}/picture/add">
<table>

<tr><td>图片1</td></tr>
<tr><td>选择照片</td><td><input type="file" name="image"/></td></tr>
<tr><td>照片名称</td><td><input type="text" name="pictures[0].name"/></td></tr>
<tr><td colspan="2"><input type="hidden" name="pictures[0].uid" value="<s:property value="user.id"/>"/></td></tr>

<tr><td>图片2</td></tr>
<tr><td>选择照片</td><td><input type="file" name="image"/></td></tr>
<tr><td>照片名称</td><td><input type="text" name="pictures[1].name"/></td></tr>
<tr><td colspan="2"><input type="hidden" name="pictures[1].uid" value="<s:property value="user.id"/>"/></td></tr>

<tr><td><input type="submit" value="提交"/></td></tr>
</table>
</form>

 

2.在数据库中建一个图片表pictures存图片信息
id int
uid int
name varchar(50)
url varchar(100)

uid对应用户users表中的主键id,在之前用户登录的使用已经把用户信息存入了session中

图片表,存的是图片的信息,没有存图片的内容,图片内容(二进制)存在目录下

 

3.编写Picture(描述一张图片信息的javabean)

package mypicture;

public class Picture {

    private int id;
    private int uid;
    private String name;
    private String url;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
}

 

4.编写PictureDAO,提供addPicture方法

/**
     * 添加照片信息到数据库
     * @param picture
     * @throws SQLException
     * @throws ClassNotFoundException
     * @throws NamingException
     */
    public void addPicture(Picture picture) throws SQLException, ClassNotFoundException, NamingException
    {
        if(conn.isClosed())
        {
            Context ctx = new InitialContext();  
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");  
            conn = ds.getConnection();
        }
        sql="insert into pictures(uid,name,url) value(?,?,?)";
        ps=conn.prepareStatement(sql);
        ps.setInt(1, picture.getUid());
        ps.setString(2,picture.getName());
        ps.setString(3,picture.getUrl());
        ps.execute();
        conn.close();
    }

 

5.文件上传的处理

处理上传的action中需要定义以下属性并提供setter和getter方法

private File image;
private String imageFileName;
String imageContentType;

代码:

package mypicture;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.NamingException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class PictureAction extends ActionSupport {

    HttpServletResponse response = ServletActionContext.getResponse();
    PrintWriter out;
    
    /**
     * 照片
     */
    private File[] image;
    /**
     * picture.name是自己取的照片名称,imageFileName是本地图片的名称
     */
    private String[] imageFileName;
    /**
     * 必须要有,不然报错
     */
    String[] imageContentType;
    /**
     * 用来存多张上传照片的信息
     */
    ArrayList<Picture> pictures = new ArrayList<>();
    /**
     * 照片信息,用来存入数据库
     */
    Picture picture;

    public File[] getImage() {
        return image;
    }
    public void setImage(File[] image) {
        this.image = image;
    }
    public String[] getImageFileName() {
        return imageFileName;
    }
    public void setImageFileName(String[] imageFileName) {
        this.imageFileName = imageFileName;
    }
    public String[] getImageContentType() {
        return imageContentType;
    }
    public void setImageContentType(String[] imageContentType) {
        this.imageContentType = imageContentType;
    }
    public ArrayList<Picture> getPictures() {
        return pictures;
    }
    public void setPictures(ArrayList<Picture> pictures) {
        this.pictures = pictures;
    }
    public Picture getPicture() {
        return picture;
    }
    public void setPicture(Picture picture) {
        this.picture = picture;
    }

    /**
     * 图片上传
     * @return
     * @throws Exception
     */
    public String add() throws Exception {
        //把图片存入本地目录
        //获取网站部署的根目录(实际目录,是电脑上的目录)
        ServletContext app=ServletActionContext.getServletContext();
        String path=app.getRealPath("")+"/images";
        //循环处理多张照片
        for(int i=0;i<image.length;i++){
            //在网站的根目录下的images文件夹下创建一个文件,用来存上传的文件,名称为imageFileName,如果不创建,上传的是临时文件会被删除
            File myfile = new File(path, imageFileName[i]);
            //若myfile的上一级目录(/images)不存在,进行创建
            if(!myfile.getParentFile().exists())
            {
                myfile.getParentFile().mkdirs();
            }
            //把上传的image存入myfile
            FileUtils.copyFile(image[i], myfile);

            //把图片信息存入数据库
            PictureDAO dao = new PictureDAO();
            //设置picture的url
            pictures.get(i).setUrl("images/"+imageFileName[i]);
            dao.addPicture(pictures.get(i));
        }
        return "userlist";
    }

}

return "userlist";  在struts.xml中进行配置,跳转到UserAction中的获取用户列表的action

 

6.配置action

picture.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    
<struts>
<package name="picture" namespace="/picture" extends="all">
    <action name="*" class="mypicture.PictureAction" method="{1}">
        
    </action>
</package>
</struts>

 

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!-- struts2常量 -->
    <!-- 控制请求action时的后缀,默认为空或者.action -->
    <constant name="struts.action.extension" value="action,,"/>
    <!-- 控制开发模式,默认为false,若为true则表示改了action后可以不重启-->
    <constant name="struts.devMode" value="true"/>
    <!-- 控制上传文件大小 3个0表示Kb,6个0表示Mb,这里为10Mb-->
    <constant name="struts.multipart.maxSize" value="10000000"/>
    
    <!-- 
    package:管理action 
    name:名称,今后别的人可以继承这个package
    namespace:路径,调action的时候也要加上才能调用
    extends:继承于哪个包
    -->
    <package name="all" namespace="" extends="struts-default">
        <!-- 控制action中全局跳转 -->
        <global-results>
            <!-- redirectAction容器外跳转,跳action -->
            <result name="userlist" type="redirectAction">
                <param name="namespace">/user</param>
                <param name="actionName">list</param>
            </result>
        </global-results>
    </package>
    <include file="user.xml"></include>
    <include file="picture.xml"></include>
</struts>

struts.xml中只存放一些公用的,防止在项目当中很多人都来修改

 

user.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="user" namespace="/user" extends="all">

    <!-- 通配符方式配置action,解决action太多的问题 -->
    <action name="*" class="myuser.UserAction" method="{1}">
        <!-- 控制action中局部跳转 -->
        <result name="main">${pageContext.request.contextPath}/main.jsp</result>
        <result name="login">${pageContext.request.contextPath}/login.jsp</result>
        <!-- 
            加了type="redirect"代表,容器外跳转
            容器外跳转跳不到userlist.jsp中去
            在这里只能用容器内跳转(同一个request范围之内)
        -->
        <result name="list">/WEB-INF/user/userlist.jsp</result>
        <result name="modify">/WEB-INF/user/modify.jsp</result>
    </action>
</package>
</struts>

 

7.效果

页面:

 

数据库:

 

图片本地存放地址:

F:\\workspaces-itcast\\workspace\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\Struts2\\images

 

8.当遇到路径出问题是,使用绝对路径,在所有跳转路径前加上
${pageContext.request.contextPath};     从根目录开始

因为在Struts2中从action中请求一个路径,是以action的路径作为起始路径

以上是关于Struts2(八.添加用户多张照片实现文件上传功能)的主要内容,如果未能解决你的问题,请参考以下文章

php中上传多张图片,如何解决?

android 客户端开发 如何同时上传多张照片

thinkphp如何将多张上传的图片根据状态分别存储!

如何使用 vanilla javascript 通过 ajax 将多张照片上传到 Laravel 应用程序?

使用 Google Firebase 同时上传多张图片

如何上传pdf照片