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(八.添加用户多张照片实现文件上传功能)的更多相关文章

  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. 三十、详述使用 IntelliJ IDEA 解决 jar 包冲突的问题

    在实际的 Maven 项目开发中,由于项目引入的依赖过多,遇到 jar 冲突算是一个很常见的问题了.在本文中,我们就一起来看看,如何使用 IntelliJ IDEA 解决 jar 包冲突的问题!简单粗 ...

  2. Segmentation fault(Core Dump)

    Segmentation fault 这个提示还是比较常见的,这个提示就是段错误,这是翻译还是十分恰当的. Core Dump 有的时候给我们呈现的翻译很有趣是”吐核“,但是实际上比较贴切的翻译是核心 ...

  3. 浮动产生的高度坍塌解决方法以及使用siblings()方法获取同级元素

    高度坍塌:如果一个没有设置高度div里的元素都是浮动元素,这个时候就可能产生高度坍塌,因为div的高度都是普通元素撑起来的,div里的元素浮动之后,元素就会脱离文档流,所以父级的div高度就可能为零, ...

  4. 记一次数据库同步经历(sql server 2008)

    前阵子搞了下数据库同步,大概意思就是服务器上有一个数据库,与本地数据库进行同步,服务器上的数据库有什么改变,可以同步到本地数据库中.做之前百度了下,流程分以下三步, 第一步: 服务器上的数据库进行发布 ...

  5. render 函数渲染表格的当前数据列使用

    columns7: [ { title: '编号', align: 'center', width: 90, key: 'No', render: (h, params) => { return ...

  6. 架构风格:你真的懂REST吗?

    本文探讨如下几个问题: 什么是REST REST包含哪些约束 什么是RESTful 纯RESTful API的难点在哪里 如果你去搜索「什么是REST」的话,大部分情况下,你看到的基本都是RESTfu ...

  7. App 运行后屏幕顶部和底部各留黑边问题 - iOS

    App 启动后屏幕的顶部和底部各产生一条黑边,App 的内容会被压缩在两个黑条内显示,比例失调的情况. 初步判断是启动页资源图片适配问题. 首先,查看工程 project => General ...

  8. RHEL6(RedHat6)和SUSE11系统配置IPV6地址

    临时生效 RHEL6和SUSE11系统临时配置IPv6地址操作是一样的,比如添加如下ipv6地址. ip - addr add ::A/ dev eth2 ip - route add default ...

  9. 自己写的代码实现Session

    package com.zq.web.context.windows; import java.util.HashMap;import java.util.Map; import org.apache ...

  10. CI框架视图继承

    CI(CodeIgniter)框架 视图继承 这个代码不是我撸的 ... 当时在哪儿找的忘了 ... 如果有侵权什么的 ... 联系我删了 ... 需要去core里面创建一个MY_loader.php ...