文档章节

Struct2文件上传

 小阿旭
发布于 2015/06/12 18:18
字数 1113
阅读 17
收藏 0
点赞 0
评论 0

开发步骤如下:

1、新建一个web工程,导入struts2上传文件所需jar,如下图

目录结构

1.jsp—uploadfile.jsp文件。

注意:form标签要使用Structs2的标签,如果使用HTML的form标签,则可能会出错,显示找不到action,原因不明。

(例如欢迎页面是index.jsp,从index跳转到uploadfile.jsp后再用HTML的form标签就会找不到对应的action

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>单文件上传</title>
</head>
<body>
	<s:form action="uploadfile1" method="post" namespace="/SingleUpload" enctype="multipart/form-data">
		<s:file name="upf" /> <s:submit value="方式1提交"/>
	</s:form>
	<br/>
	<s:form action="uploadfile2" method="post" namespace="/SingleUpload" enctype="multipart/form-data">
		<s:file name="upf" /> <s:submit value="方式2提交" />		
	</s:form>
</body>
</html>

  

2.struts.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <!-- 该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
        如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 -->
    <constant name="struts.action.extension" value="do" />
    <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->
    <constant name="struts.serve.static.browserCache" value="false" />
    <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->
    <constant name="struts.configuration.xml.reload" value="true" />
    <!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
    <constant name="struts.devMode" value="true" />
    <!-- 默认的视图主题 -->
    <constant name="struts.ui.theme" value="simple" />
    <!--<constant name="struts.objectFactory" value="spring" />-->
    <!--解决乱码    -->
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
    <constant name="struts.multipart.maxSize" value="10701096"/>
    <!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
    <constant name="struts.multipart.saveDir " value="d:/tmp" />
    
         
    <!-- 文件上传action -->
    <package name="SingleUpload" extends="struts-default" namespace="/SingleUpload">
	<!-- 单文件上传,方法1 -->
	<action name="uploadfile1" class="com.oschina.upload.SingleUploadAction" method="execute1"  >
	    <!-- <param name="savePath">D:/FileUpLoad</param> -->
	    <result name="success">/success.jsp</result>  
	    <result name="error">/error.jsp</result>   
	</action>
	  
	<!-- 单文件上传,方法2 -->
	<action name="uploadfile2" class="com.oschina.upload.SingleUploadAction" method="execute2">
            <param name="savePath">D:/FileUpLoad</param>
	    <result name="success">/success.jsp</result>  
	    <result name="error">/error.jsp</result> 
	   
	    <!-- 配置过滤器 -->	    
            <interceptor-ref name="fileUpload">                
              <!-- <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param> --><!-- 文件过滤 -->                
               <param name="maximumSize">1025956</param><!-- 文件大小, 以字节为单位 -->
            </interceptor-ref>            
           <interceptor-ref name="defaultStack" /> <!-- 默认拦截器必须放在fileUpload之后,否则无效 -->
      </action>
   </package>
</struts>

3、Action—SingleUploadAction.java

 package com.oschina.upload;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class SingleUploadAction extends ActionSupport{
    
    private File upf; //上传的文件
    private String upfFileName; //文件名称
    private String upfContentType; //文件类型
    private String savePath;  //设置的文件保存路径
    //第一种方式,使用FileUtils工具类复制文件。
    public String execute1()  {
    	System.out.print("come into excute1");
    	System.out.print("F://");
        if (upf != null) {
            File savefile = new File("d://FileUpLoad", upfFileName);
            if (!savefile.getParentFile().exists()){
            	savefile.mkdirs();
            }
                
            try {
				FileUtils.copyFile(upf, savefile);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            ActionContext.getContext().put("upf-message", "使用方法1成功上传文件:"+upfFileName);
            return "success";
        }
        return "error";
    }
    //第二种方式,使用文件流读写存储
    public String execute2()  {
    	System.out.print("come into excute2");
    	System.out.println("文件的存储路径为:"+savePath);
    	FileOutputStream fos = null;
        FileInputStream fis = null;
        Boolean result = true;
        try {
        	// 建立文件上传流
            fis = new FileInputStream(upf);
        	// 建立文件输出流           
            fos = new FileOutputStream(getSavePath() + "\\" + upfFileName);            
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = fis.read(buffer)) > 0) {
                fos.write(buffer, 0, len);
            }
            ActionContext.getContext().put("upf-message", "使用方法2成功上传文件:"+upfFileName);
        } catch (Exception e) {
            result = false;
        	System.out.println("文件上传失败");
            e.printStackTrace();            
        } finally {
            close(fos, fis);
        }
        if (result) {
            return SUCCESS; 
	}else {
	    return "error";
	}
               
    }
    
    private void close(FileOutputStream fos, FileInputStream fis) {
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                System.out.println("FileInputStream关闭失败");
                e.printStackTrace();
            }
        }
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                System.out.println("FileOutputStream关闭失败");
                e.printStackTrace();
            }
        }
    }

	public File getUpf() {
		return upf;
	}

	public void setUpf(File upf) {
		this.upf = upf;
	}

	public String getUpfFileName() {
		return upfFileName;
	}

	public void setUpfFileName(String upfFileName) {
		this.upfFileName = upfFileName;
	}

	public String getUpfContentType() {
		return upfContentType;
	}

	public void setUpfContentType(String upfContentType) {
		this.upfContentType = upfContentType;
	}

	public String getSavePath() {
		return savePath;
	}

	public void setSavePath(String savePath) {
		this.savePath = savePath;
	}

    
    
}

 

4显示结果页面—success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<html>
  <head>
    <base href="<%=basePath%>">    
    <title>请求成功</title>    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>	  
	<s:property value="upf-message" />
 </body>
</html>


© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 2
码字总数 1113
作品 0
朝阳
SSH2中配置了*.action 访问jsp页面访问出错

为了做图片上传时候能够用request得到路径。只能把struct2中在web.xml的配置改成了 struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2...

小石头哥 ⋅ 2012/08/21 ⋅ 8

ylbtech-LanguageSamples-Struct(结构)

ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Struct(结构) 1.A,示例(Sample)返回顶部 “结构”示例 本示例演示结构的语法和用法。它还介绍了类与结构之间的重大差异。有关更多...

吞吞吐吐的 ⋅ 2017/10/05 ⋅ 0

SSH date标签显示不出来

外层为一迭代,里层用struct2标签显示,可是时间显示不出来。 另一个能正常显示是 averageRental 代码如下:

李东亮 ⋅ 2014/04/19 ⋅ 1

请问目前tapestry人才是不是很少?

tapestry3,tapestry4,tapestry5这一路发展,各位觉得怎样?好像目前大部分人都是学struct2的啊。。 另外一个问题:学习tapestry需要多少时间能够进入开发?...

夜夜夜夜 ⋅ 2011/11/24 ⋅ 2

Spring mvc 拦截器拦截后跳转方法疑惑

Spring mvc 拦截器拦截后方法疑惑: 网上Spring mvc 拦截器拦截后跳转有两种方法: (1)response重定向(传信息很不方便,get方式将信息写进去) response.sendRedirect("/Go/login/login.j...

李东亮 ⋅ 2014/07/30 ⋅ 0

巨大的菜鸟求指导,有关学习资料。

功能比较简单。 在页面上展示一个表单,实现增删改查的功能,页面使用jquery easyui的datagird 数据库使用mysql. 自己用struct2和hibernate实现了一下,但是觉得自己的代码写的很乱。想看看别...

zzbutcher ⋅ 2014/08/19 ⋅ 0

关于javaweb如何实现类似QQ空间动态及评论数据在jsp页面遍历的问题

我目前想到三种办法,但觉得都不可取,求有经验的大神指点。 方法一:表单提交方式,通过Struct2的s:iterator标签从request域中获取遍历数据,但这种方式会把表情及图片的img标签给转义,将无...

二环南路上的狂奔 ⋅ 2016/04/18 ⋅ 1

Struts2 内核之我见

http://www.ibm.com/developerworks/cn/java/j-lo-struct2/ 简介: 本文首先探讨了 Struts2 核心控制器的源码,以帮助解读 Struts2 的工作流程。接着讲解相关外围类。最后对 Struts 的工作流...

一时想不清晰 ⋅ 2011/08/16 ⋅ 0

我在写一个ssh的项目,在页面有一个点击事件通过ajax提交到action 处理后解析返回到页面。为什么一直是

这个错误,看了一天了不知道为何 具体代码action // 查询某个id的地名信息 public String findPlaceInfo() { // 获取传过来的id HttpServletRequest request = ServletActionContext.getReq...

haifujiang ⋅ 2017/03/17 ⋅ 1

Struts2再爆远程代码执行漏洞(S2-016)

Struts又爆远程代码执行漏洞了!在这次的漏洞中,攻击者可以通过操纵参数远程执行恶意代码。Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction没有正确过滤,导致ognl代...

harries ⋅ 2014/07/28 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JDK1.6和JDK1.7中,Collections.sort的区别,

背景 最近,项目正在集成测试阶段,项目在服务器上运行了一段时间,点击表格的列进行排序的时候,有的列排序正常,有的列在排序的时候,在后台会抛出如下异常,查询到不到数据,而且在另外一...

tsmyk0715 ⋅ 6分钟前 ⋅ 0

spring RESTful

spring RESTful官方文档:http://spring.io/guides/gs/rest-service/ 1. 可以这么去理解RESTful:其实就是web对外提供的一种基于URL、URI的资源供给服务。不是一个原理性知识点。是一个方法论...

BobwithB ⋅ 8分钟前 ⋅ 0

C++ 中命名空间的 5 个常见用法

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名...

柳猫 ⋅ 11分钟前 ⋅ 0

@Conditional派生注解

@Conditional派生注解(Spring注解版原生的@Conditional作用) 作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效; @Conditional扩展注解 作用(判...

小致dad ⋅ 11分钟前 ⋅ 0

适配器模式

适配器模式 对象适配器 通过私有属性来实现的类适配器 通过继承来实现的接口适配器 通过继承一个默认实现的类实现的

Cobbage ⋅ 15分钟前 ⋅ 0

Java 限流策略

概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速...

轨迹_ ⋅ 19分钟前 ⋅ 0

GridView和子View之间的间隙

默认的情况下GridView和子View之间会有一个间隙,原因是GridView为了在子View被选中时在子View周围显示一个框。去掉的办法如下: android:listSelector="#0000" 或 setSelector(new ColorDra...

国仔饼 ⋅ 22分钟前 ⋅ 0

idea插件开发

1 刷新页面要使用多线程 2 调试要使用restart bug 不要去关闭调试的idea 否则再次启动会卡住

林伟琨 ⋅ 22分钟前 ⋅ 0

Java 内存模型

物理机并发处理方案 绝大多数计算任务,并不是单纯依赖 cpu 的计算完成,不可避免需要与内存交互,获取数据。内存要拿到数据,需要和硬盘发生 I/O 操作。计算机存储设备与 cpu 之间的处理速度...

长安一梦 ⋅ 29分钟前 ⋅ 0

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 50分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部