1.modify.jsp

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

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

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

代码:

  1. 上传照片
  2. <br>
  3. <br>
  4. <!-- 照片上传,可以上传多个文件 -->
  5. <form method="post" enctype="multipart/form-data" action="${pageContext.request.contextPath}/picture/add">
  6. <table>
  7.  
  8. <tr><td>图片1</td></tr>
  9. <tr><td>选择照片</td><td><input type="file" name="image"/></td></tr>
  10. <tr><td>照片名称</td><td><input type="text" name="pictures[0].name"/></td></tr>
  11. <tr><td colspan="2"><input type="hidden" name="pictures[0].uid" value="<s:property value="user.id"/>"/></td></tr>
  12.  
  13. <tr><td>图片2</td></tr>
  14. <tr><td>选择照片</td><td><input type="file" name="image"/></td></tr>
  15. <tr><td>照片名称</td><td><input type="text" name="pictures[1].name"/></td></tr>
  16. <tr><td colspan="2"><input type="hidden" name="pictures[1].uid" value="<s:property value="user.id"/>"/></td></tr>
  17.  
  18. <tr><td><input type="submit" value="提交"/></td></tr>
  19. </table>
  20. </form>

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

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

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

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

  1. package mypicture;
  2.  
  3. public class Picture {
  4.  
  5. private int id;
  6. private int uid;
  7. private String name;
  8. private String url;
  9. public int getId() {
  10. return id;
  11. }
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15. public int getUid() {
  16. return uid;
  17. }
  18. public void setUid(int uid) {
  19. this.uid = uid;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public String getUrl() {
  28. return url;
  29. }
  30. public void setUrl(String url) {
  31. this.url = url;
  32. }
  33. }

4.编写PictureDAO,提供addPicture方法

  1. /**
  2. * 添加照片信息到数据库
  3. * @param picture
  4. * @throws SQLException
  5. * @throws ClassNotFoundException
  6. * @throws NamingException
  7. */
  8. public void addPicture(Picture picture) throws SQLException, ClassNotFoundException, NamingException
  9. {
  10. if(conn.isClosed())
  11. {
  12. Context ctx = new InitialContext();
  13. DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
  14. conn = ds.getConnection();
  15. }
  16. sql="insert into pictures(uid,name,url) value(?,?,?)";
  17. ps=conn.prepareStatement(sql);
  18. ps.setInt(1, picture.getUid());
  19. ps.setString(2,picture.getName());
  20. ps.setString(3,picture.getUrl());
  21. ps.execute();
  22. conn.close();
  23. }

5.文件上传的处理

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

private File image;
private String imageFileName;
String imageContentType;

代码:

  1. package mypicture;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.sql.SQLException;
  7. import java.util.ArrayList;
  8. import javax.naming.NamingException;
  9. import javax.servlet.ServletContext;
  10. import javax.servlet.http.HttpServletResponse;
  11. import org.apache.commons.io.FileUtils;
  12. import org.apache.struts2.ServletActionContext;
  13. import com.opensymphony.xwork2.ActionSupport;
  14.  
  15. public class PictureAction extends ActionSupport {
  16.  
  17. HttpServletResponse response = ServletActionContext.getResponse();
  18. PrintWriter out;
  19.  
  20. /**
  21. * 照片
  22. */
  23. private File[] image;
  24. /**
  25. * picture.name是自己取的照片名称,imageFileName是本地图片的名称
  26. */
  27. private String[] imageFileName;
  28. /**
  29. * 必须要有,不然报错
  30. */
  31. String[] imageContentType;
  32. /**
  33. * 用来存多张上传照片的信息
  34. */
  35. ArrayList<Picture> pictures = new ArrayList<>();
  36. /**
  37. * 照片信息,用来存入数据库
  38. */
  39. Picture picture;
  40.  
  41. public File[] getImage() {
  42. return image;
  43. }
  44. public void setImage(File[] image) {
  45. this.image = image;
  46. }
  47. public String[] getImageFileName() {
  48. return imageFileName;
  49. }
  50. public void setImageFileName(String[] imageFileName) {
  51. this.imageFileName = imageFileName;
  52. }
  53. public String[] getImageContentType() {
  54. return imageContentType;
  55. }
  56. public void setImageContentType(String[] imageContentType) {
  57. this.imageContentType = imageContentType;
  58. }
  59. public ArrayList<Picture> getPictures() {
  60. return pictures;
  61. }
  62. public void setPictures(ArrayList<Picture> pictures) {
  63. this.pictures = pictures;
  64. }
  65. public Picture getPicture() {
  66. return picture;
  67. }
  68. public void setPicture(Picture picture) {
  69. this.picture = picture;
  70. }
  71.  
  72. /**
  73. * 图片上传
  74. * @return
  75. * @throws Exception
  76. */
  77. public String add() throws Exception {
  78. //把图片存入本地目录
  79. //获取网站部署的根目录(实际目录,是电脑上的目录)
  80. ServletContext app=ServletActionContext.getServletContext();
  81. String path=app.getRealPath("")+"/images";
  82. //循环处理多张照片
  83. for(int i=0;i<image.length;i++){
  84. //在网站的根目录下的images文件夹下创建一个文件,用来存上传的文件,名称为imageFileName,如果不创建,上传的是临时文件会被删除
  85. File myfile = new File(path, imageFileName[i]);
  86. //若myfile的上一级目录(/images)不存在,进行创建
  87. if(!myfile.getParentFile().exists())
  88. {
  89. myfile.getParentFile().mkdirs();
  90. }
  91. //把上传的image存入myfile
  92. FileUtils.copyFile(image[i], myfile);
  93.  
  94. //把图片信息存入数据库
  95. PictureDAO dao = new PictureDAO();
  96. //设置picture的url
  97. pictures.get(i).setUrl("images/"+imageFileName[i]);
  98. dao.addPicture(pictures.get(i));
  99. }
  100. return "userlist";
  101. }
  102.  
  103. }

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

6.配置action

picture.xml:

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

struts.xml:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5.  
  6. <struts>
  7. <!-- struts2常量 -->
  8. <!-- 控制请求action时的后缀,默认为空或者.action -->
  9. <constant name="struts.action.extension" value="action,,"/>
  10. <!-- 控制开发模式,默认为false,若为true则表示改了action后可以不重启-->
  11. <constant name="struts.devMode" value="true"/>
  12. <!-- 控制上传文件大小 3个0表示Kb,6个0表示Mb,这里为10Mb-->
  13. <constant name="struts.multipart.maxSize" value="10000000"/>
  14.  
  15. <!--
  16. package:管理action
  17. name:名称,今后别的人可以继承这个package
  18. namespace:路径,调action的时候也要加上才能调用
  19. extends:继承于哪个包
  20. -->
  21. <package name="all" namespace="" extends="struts-default">
  22. <!-- 控制action中全局跳转 -->
  23. <global-results>
  24. <!-- redirectAction容器外跳转,跳action -->
  25. <result name="userlist" type="redirectAction">
  26. <param name="namespace">/user</param>
  27. <param name="actionName">list</param>
  28. </result>
  29. </global-results>
  30. </package>
  31. <include file="user.xml"></include>
  32. <include file="picture.xml"></include>
  33. </struts>

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

user.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5.  
  6. <struts>
  7. <package name="user" namespace="/user" extends="all">
  8.  
  9. <!-- 通配符方式配置action,解决action太多的问题 -->
  10. <action name="*" class="myuser.UserAction" method="{1}">
  11. <!-- 控制action中局部跳转 -->
  12. <result name="main">${pageContext.request.contextPath}/main.jsp</result>
  13. <result name="login">${pageContext.request.contextPath}/login.jsp</result>
  14. <!--
  15. 加了type="redirect"代表,容器外跳转
  16. 容器外跳转跳不到userlist.jsp中去
  17. 在这里只能用容器内跳转(同一个request范围之内)
  18. -->
  19. <result name="list">/WEB-INF/user/userlist.jsp</result>
  20. <result name="modify">/WEB-INF/user/modify.jsp</result>
  21. </action>
  22. </package>
  23. </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(八.添加用户多张照片实现文件上传功能)的更多相关文章

  1. 037. asp.netWeb用户控件之五使用用户控件实现文件上传功能

    fileUpload.ascx代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile= ...

  2. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  3. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. 使用element的upload组件实现一个完整的文件上传功能(下)

    本篇文章是<使用element的upload组件实现一个完整的文件上传功能(上)>的续篇. 话不多说,接着上一篇直接开始 一.功能完善—保存表格中每一列的文件列表状态 1.思路 保存表格中 ...

  5. 达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面

    于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模 ...

  6. 文件/大文件上传功能实现(JS+PHP)全过程

    文件/大文件上传功能实现(JS+PHP) 参考博文:掘金-橙红年代 前端大文件上传 路漫漫 其修远 PHP + JS 实现大文件分割上传 本文是学习文件上传后的学习总结文章,从无到有实现文件上传功能, ...

  7. 使用element的upload组件实现一个完整的文件上传功能(上)

    说到标题就有点心塞了,前段时间项目上需要实现一个文件上传的功能,然后就咔咔的去用了element的upload组件,不用不知道一用吓一跳哇. 在使用的过程中遇到了很多让意想不到的问题,后来也因为时间问 ...

  8. iOS 的 Safari 文件上传功能详解

    iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). ...

  9. [php基础]PHP.INI配置:文件上传功能配置教程

    昨天分享了在PHP网站开发中如何在php.ini中配置实现session功能的PHP教程,今天继续分享在利用PHP实现文件上传功能时几点关键php.ini的配置. 说到在php.ini中的文件上传的配 ...

随机推荐

  1. 如何设置ASP.NET页面的运行超时时间 (转载)

    全局超时时间 服务器上如果有多个网站,希望统一设置一下超时时间,则需要设置 Machine.config 文件中的 ExecutionTimeout 属性值.Machine.config 文件位于 % ...

  2. python对文件进行读写操作

    转:http://sucre.iteye.com/blog/704077 ython进行文件读写的函数是open或file file_handler = open(filename,,mode) Ta ...

  3. oracle在线迁移同步数据,数据库报错

    报需要升级的错误,具体处理步骤如下: 一.错误信息 SQL> alter database open ;alter database open resetlogs*ERROR at line 1 ...

  4. 04 关于oracle的锁的级别以及介绍

    关于oracle的锁的级别以及介绍 oracle造成锁表的情况: 一.查看锁的对象视图:select object_id,session_id,locked_mode from v$locked_ob ...

  5. github常见操作和常见错误

    配置git的时候会使用git config,三种配置分别为git config.git config --global.git config --system. 它们之前的优先级为(由高到低):git ...

  6. Win10英文系统 JDK1.8安装及环境变量配置

    前提 今天换新电脑了,需要重新安装一遍JDK.写个随笔记录一下整个过程. 下载 官网上JDK已经出到10了,但是回忆起JDK9都有各种坑(不支持一些软件),决定还是用JDK8. 下载地址: http: ...

  7. git 项目常用

    本地分支推送到远程分支: (1),git init,git add . (2),git commit -m "首次提交" (3),git remote add origin '远程 ...

  8. vi模式下的编辑、删除、保存和退出

    vi + 文件名:进入 vi 模式 编辑模式:shift+: 退出编辑模式:Esc 退出编辑模式后可进行光标的上下左右移动(偶尔会出现ABCD,还不知道怎么解决,目前只能出来一个删除一个) 光标处:按 ...

  9. [转载zz] Python3 输入和输出之序列化与反序列化

    http://www.runoob.com/python3/python3-inputoutput.html pickle 模块 python的pickle模块实现了基本的数据序列和反序列化. 通过p ...

  10. 使用Goland同步远程代码

    新版本的goland貌似已经有了Deployment功能,故本篇文章描述的方法也不推荐使用了 以前写php时候习惯使用phpstorm这个编译器,除去本身功能强大不说,比较方便的是其自身带的Deplo ...