文档章节

Struct2文件上传

 小阿旭
发布于 2015/06/12 18:18
字数 1113
阅读 17
收藏 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
2.7K
8
ylbtech-LanguageSamples-Struct(结构)

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

吞吞吐吐的
2017/10/05
0
0
请问目前tapestry人才是不是很少?

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

夜夜夜夜
2011/11/24
664
2
SSH date标签显示不出来

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

李东亮
2014/04/19
204
1
Struct2 的开发模式的配置问题

官方的struct.xml 示例中,如果要切换为开发模式,往往是要在中加下以下内容 但这么改了之后却发现,我每次更改了struct2的配置文件后,还是必须要重启tomcat才会生效 经过研究发现,如果改成...

海阔天空yy
2014/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

弹性工作制的魔咒

简评:你找到了一份完美的工作 —— 可以提前离开公司,还可以在晚上从家里回复邮件。既然如此,你为什么还会有那么强的负罪感呢? 或许是弹性工作制魔咒在作祟。 很多享受弹性工作制的人会始...

极光推送
4分钟前
0
0
KAFKA介绍(分布式架构)

Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以...

明理萝
10分钟前
0
1
os::NodeHandle::subscribe回调函数绑定对象

void Foo::callback(const std_msgs::Empty::ConstPtr& message){}Foo foo_object;ros::Subscriber sub = handle.subscribe("my_topic", 1, &Foo::callback, &foo_object); 参考: ht......

itfanr
11分钟前
0
0
React16.4 开发简书项目 从零基础入门到实战

React16.4 开发简书项目 从零基础入门到实战 关注我的订阅号下载 React16.4 开发简书项目 从零基础入门到实战

蜗牛奔跑
14分钟前
0
0
day57-20180815-流利阅读笔记-待学习

社恐怎么办?这个漫画或许能治愈你 毛西 2018-08-15 1.今日导读 近日,芬兰漫画家卡罗利娜·科尔霍宁创作的绘本《芬兰人的噩梦》在中国大火。一时间书中的主人公马蒂成为了人们茶余饭后热议的...

aibinxiao
18分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部