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(八.添加用户多张照片实现文件上传功能)的主要内容,如果未能解决你的问题,请参考以下文章