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(八.添加用户多张照片实现文件上传功能)
原文地址:https://www.cnblogs.com/zizi-tothemoon/p/9360012.html