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中的文件上传的配 ...
随机推荐
- 如何设置ASP.NET页面的运行超时时间 (转载)
全局超时时间 服务器上如果有多个网站,希望统一设置一下超时时间,则需要设置 Machine.config 文件中的 ExecutionTimeout 属性值.Machine.config 文件位于 % ...
- python对文件进行读写操作
转:http://sucre.iteye.com/blog/704077 ython进行文件读写的函数是open或file file_handler = open(filename,,mode) Ta ...
- oracle在线迁移同步数据,数据库报错
报需要升级的错误,具体处理步骤如下: 一.错误信息 SQL> alter database open ;alter database open resetlogs*ERROR at line 1 ...
- 04 关于oracle的锁的级别以及介绍
关于oracle的锁的级别以及介绍 oracle造成锁表的情况: 一.查看锁的对象视图:select object_id,session_id,locked_mode from v$locked_ob ...
- github常见操作和常见错误
配置git的时候会使用git config,三种配置分别为git config.git config --global.git config --system. 它们之前的优先级为(由高到低):git ...
- Win10英文系统 JDK1.8安装及环境变量配置
前提 今天换新电脑了,需要重新安装一遍JDK.写个随笔记录一下整个过程. 下载 官网上JDK已经出到10了,但是回忆起JDK9都有各种坑(不支持一些软件),决定还是用JDK8. 下载地址: http: ...
- git 项目常用
本地分支推送到远程分支: (1),git init,git add . (2),git commit -m "首次提交" (3),git remote add origin '远程 ...
- vi模式下的编辑、删除、保存和退出
vi + 文件名:进入 vi 模式 编辑模式:shift+: 退出编辑模式:Esc 退出编辑模式后可进行光标的上下左右移动(偶尔会出现ABCD,还不知道怎么解决,目前只能出来一个删除一个) 光标处:按 ...
- [转载zz] Python3 输入和输出之序列化与反序列化
http://www.runoob.com/python3/python3-inputoutput.html pickle 模块 python的pickle模块实现了基本的数据序列和反序列化. 通过p ...
- 使用Goland同步远程代码
新版本的goland貌似已经有了Deployment功能,故本篇文章描述的方法也不推荐使用了 以前写php时候习惯使用phpstorm这个编译器,除去本身功能强大不说,比较方便的是其自身带的Deplo ...