文档章节

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>


© 著作权归作者所有

共有 人打赏支持
上一篇: 谈谈去 IOE 运动
下一篇: 谈谈去 IOE 运动
粉丝 0
博文 2
码字总数 1113
作品 0
朝阳
私信 提问
SSH2中配置了*.action 访问jsp页面访问出错

为了做图片上传时候能够用request得到路径。只能把struct2中在web.xml的配置改成了 struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 *.action 结果在访问jsp页面的时候只要...

小石头哥
2012/08/21
2.7K
8
ylbtech-LanguageSamples-Struct(结构)

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

吞吞吐吐的
2017/10/05
0
0
SSH date标签显示不出来

外层为一迭代,里层用struct2标签显示,可是时间显示不出来。 另一个能正常显示是 代码如下: 求教错在什么地方

李东亮
2014/04/19
221
1
请问目前tapestry人才是不是很少?

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

夜夜夜夜
2011/11/24
816
2
Struct2 的开发模式的配置问题

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

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

没有更多内容

加载失败,请刷新页面

加载更多

使用form表单同时实现上传文件和提交文本数据

使用form表单同时实现上传文件和提交文本数据,此示例中在后台将文件上传到阿里的oss存储服务器中 申请oss相关账号: endpoint = "http://oss-cn-qingdao.aliyuncs.com"; accessKeyId = "key"...

貔貅叔
16分钟前
1
0
结合实际场景谈一谈微服务配置

作为 Nacos 5W1H 的系列文章,本文将围绕“Where”,讲述 Nacos 配置管理的三个典型的应用场景: 数据库连接信息 限流阈值和降级开关 流量的动态调度 上一篇:Nacos帮我解决了什么问题? 数据...

阿里云云栖社区
18分钟前
1
0
在Windows安装运行Kafka

https://www.cnblogs.com/flower1990/p/7466882.html 一、安装JAVA JDK 1、下载安装包 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 注意:根据3......

洛水
19分钟前
1
0
插件

sftp Bracket Pair Colorizer Guides Auto Rename Tag Chinese (Simplified) Language Pack for Visual Studio Code...

dragon_tech
20分钟前
1
0
Missing Number(leetcode268)

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array. Example 1: Input: [3,0,1]Output: 2 Example 2: Input: [9,6......

woshixin
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部