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(八.添加用户多张照片实现文件上传功能)的更多相关文章
- 037. asp.netWeb用户控件之五使用用户控件实现文件上传功能
fileUpload.ascx代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile= ...
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 使用element的upload组件实现一个完整的文件上传功能(下)
本篇文章是<使用element的upload组件实现一个完整的文件上传功能(上)>的续篇. 话不多说,接着上一篇直接开始 一.功能完善—保存表格中每一列的文件列表状态 1.思路 保存表格中 ...
- 达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面
于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模 ...
- 文件/大文件上传功能实现(JS+PHP)全过程
文件/大文件上传功能实现(JS+PHP) 参考博文:掘金-橙红年代 前端大文件上传 路漫漫 其修远 PHP + JS 实现大文件分割上传 本文是学习文件上传后的学习总结文章,从无到有实现文件上传功能, ...
- 使用element的upload组件实现一个完整的文件上传功能(上)
说到标题就有点心塞了,前段时间项目上需要实现一个文件上传的功能,然后就咔咔的去用了element的upload组件,不用不知道一用吓一跳哇. 在使用的过程中遇到了很多让意想不到的问题,后来也因为时间问 ...
- iOS 的 Safari 文件上传功能详解
iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). ...
- [php基础]PHP.INI配置:文件上传功能配置教程
昨天分享了在PHP网站开发中如何在php.ini中配置实现session功能的PHP教程,今天继续分享在利用PHP实现文件上传功能时几点关键php.ini的配置. 说到在php.ini中的文件上传的配 ...
随机推荐
- 动态截屏软件jpg格式
软件下载地址:https://github.com/weibanggang/jiedu 开始截屏 保存路径 生成图片 预览
- 用Java+xml配置方式实现Spring数据事务(编程式事务)
一.用Java配置的方式 1.实体类: Role public class Role { private int id; private String roleName; private String ...
- 2.java编辑器和java大致内容
离开了宇宙第一IDE.对java的编辑的选择有点茫然. .net只有一个你不用选择.java好几个.对于追求完美的我来说.总想选个完美的.上网百度可一下.最经典的当然是eclipse了. 但是觉得有点 ...
- PHP实现数组递归转义的方法
本文以实例形式讲述了PHP实现数组递归转义的方法,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: $arr = array('a"aa',array("c'd&quo ...
- 产品 | What's产品经理
如果想知道什么是产品,首先需要知道什么是缔造者.其名曰:"产品经理". PS:产品经理一词在国内大多时候泛指"互联网产品经理". 对于产品经理这一职位,说实在很 ...
- 如何应用SPRITEKIT的CAMERA实现游戏中的ENDLESS无限循环背景
A Tutorial For How To Use SpriteKit Camera Making Endless Background Player运用Camera节点向前移动的效果 向前舞动 命为 ...
- #leetcode刷题之路8-字符串转换整数 (atoi)
请你来实现一个 atoi 函数,使其能将字符串转换成整数.首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止.当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面 ...
- python初学者日记02(正则表达式)
写作时间:2018/12/17 作者:永远的码农(博客园) 一.正则表达式简介: 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或R ...
- Django学习笔记4-csrf防护
1.CSRF验证失败. 请求被中断. 原因是django为了在用户提交表单时防止跨站攻击所做的保护 什么是 CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求 ...
- Python模块、包、异常、文件(案例)
Python模块.包.异常.文件(案例) python.py #模块 # Python中的模块(Module),是一个Python文件,以.py文件结尾,包含了Python对象定义和Python语句, ...