`
SIHAIloveYAN
  • 浏览: 119946 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

struts2教程(8)--文件上传下载

 
阅读更多

Struts2文件上传下载

一、Struts2文件上传

提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容

fileUpload拦截器 默认在 defaultStack 栈中, 默认会执行的

Action需要对上传文件内容进行接收

页面

<input type="file" name="upload" />


Action

	public class UploadAction extends ActionSupport {

// 接收上传内容

// <input type="file" name="upload" />

private File upload; // 这里变量名 和 页面表单元素 name 属性一致

private String uploadContentType;

private String uploadFileName;

} 

注意:

格式 : 上传表单项name属性 + ContentType 、 上传表单项name属性 + FileName

为三个对象 提供 setter 方法

通过FileUtils 提供 copyFile 进行文件复制,将上传文件 保存到服务器端


二、Struts2文件上传问题解决

1、配置 input 视图 ,作为上传出错后 跳转页面

在文件上传时,如果发生错误 fileUpload拦截器 会设置错误信息,workflow拦截器 跳转到 input 视图

2、struts.multipart.parser=jakarta 定义文件上传,采用 commons-fileupload 技术

同时支持 cos pell 上传技术 (如果使用其它上传技术,单独下载jar包 )

3、通过 struts.multipart.maxSize 常量设置文件上传总大小限制

struts.multipart.maxSize=2097152 默认上传文件总大小 2MB

超过文件总大小,跳转input 视图, 通过 <s:actionError /> 回显错误信息


4、在struts.xml 设置上传总大小

<constant name="struts.multipart.maxSize" value="20000000"></constant>


5、设置上传文件总大小,对所有上传form有效,只想对当前form进行设置,可以设置fileUpload拦截器属性

FileUpload 拦截器有 3 个属性可以设置.

* maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB

* allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔

* allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔

如果针对fileUpload 进行参数设置,当出错时,在页面通过 <s:fieldError /> 回显错误信息

struts-messages.properties 文件里预定义 上传错误信息,通过覆盖对应key 显示中文信息

struts.messages.error.uploading=Error uploading: {0}

struts.messages.error.file.too.large=The file is to large to be uploaded: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}

修改为

struts.messages.error.uploading=上传错误: {0}

struts.messages.error.file.too.large=上传文件太大: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=上传文件的类型不允许: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: {0} "{1}" "{2}" {3}


上传案例:

jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>My JSP 'index.jsp' starting page</title>
	
  </head>
  
  <body>
  	<s:fielderror/>
  	<s:actionerror/>
  	<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
  		<input type="file" name="upload"><br>
  		<input type="file" name="upload"><br>
  		<input type="file" name="upload"><br>
  		<input type="submit" value="上传">
  	</form>
  </body>
</html>

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>
	<constant name="struts.custom.i18n.resources" value="message"></constant>
	<constant name="struts.multipart.maxSize" value="20971520"></constant>
	<package name="default" namespace="/" extends="struts-default">


		<action name="upload" class="com.sihai.action.UploadAction">
			<result name="input">/upload.jsp</result>
			<interceptor-ref name="defaultStack">
				<param name="maximumSize">2097152</param>
				<param name="fileUpload.allowedExtensions">txt,mp3,doc</param>
			</interceptor-ref>
		</action>

	</package>
</struts>

action:

package com.sihai.action;

import java.io.File;
import java.util.List;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {

	// 在action类中需要声明三个属性
	private List<File> upload;
	private List<String> uploadContentType;
	private List<String> uploadFileName;

	public List<File> getUpload() {
		return upload;
	}

	public void setUpload(List<File> upload) {
		this.upload = upload;
	}

	public List<String> getUploadContentType() {
		return uploadContentType;
	}

	public void setUploadContentType(List<String> uploadContentType) {
		this.uploadContentType = uploadContentType;
	}

	public List<String> getUploadFileName() {
		return uploadFileName;
	}

	public void setUploadFileName(List<String> uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	@Override
	public String execute() throws Exception {

		for (int i = 0; i < upload.size(); i++) {
			
			
			System.out.println("上传文件的类型:" + uploadContentType.get(i));
			System.out.println("上传文件的名称:" + uploadFileName.get(i));

			// 完成文件上传.
			FileUtils.copyFile(upload.get(i), new File("d:/upload", uploadFileName.get(i)));
		}
		return null;
	}

}


三、多文件上传

第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jarcommons-io-1.3.2.jar。这两个文件可以从http://commons.apache.org/下载。

第二步:把form表的enctype设置为:“multipart/form-data“,如下:

<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">

  <input  type="file" name="uploadImages">

  <input  type="file" name="uploadImages">

</form>


第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称:

public class uploadAction{

  private File[] uploadImages;//得到上传的文件

  private String[] uploadImagesContentType;//得到文件的类型

  private String[] uploadImagesFileName;//得到文件的名称

  //这里略省了属性的getter/setter方法

  public String saveFiles() throws Exception{

        ServletContext sc = ServletActionContext.getServletContext();

        String realpath = sc.getRealPath("/uploadfile");

        try {

            if(uploadImages!=null&&uploadImages.length>0){

                 for(int i=0;i<uploadImages.length;i++){

                         File destFile = new File(realpath,uploadImageFileNames[i]);

                         FileUtils.copyFile(uploadImages[i], destFile);

                  }

             }

         } catch (IOException e) {

              e.printStackTrace();}return "success";}}

 


四、Struts2文件下载

1struts2 完成文件下载,通过 结果集类型 (Result Typestream 来完成的

struts-default.xml 定义 <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>


2) 使用Stream结果集 完成文件下载

文件下载原理: 服务器读取下载文件内容,通过Response响应流写回, 设置 ContentTypeContentDisposition 头信息

public class StreamResult extends StrutsResultSupport {

protected String contentType = "text/plain"; // contentType头信息  (下载文件对应 MIME协议规定类型 )

protected String contentDisposition = "inline"; // ContentDisposition头信息 (下载文件打开方式 inline浏览器内部打开, attachment 以附件形式打开)

protected String inputName = "inputStream";  // 需要Action中 提供 getInputStream 方法 返回 InputStream 提供下载文件 内容

} 


3)Action 提供 InputStream 返回值 getInputStream 方法 ------- 指定下载文件流

配置 stream 结果集 参数 <param name="contentType">${contentType}</param> ---- Action 中提供 getContentType


ServletActionContext.getServletContext().getMimeType(filename);

配置 stream 结果集 参数 <param name="contentDisposition">attachment;filename=${filename}</param> ---- Action 提供 getFilename


下载附件名乱码问题

	public String encodeDownloadFilename(String filename, String agent)

throws IOException {

if (agent.contains("Firefox")) { // 火狐浏览器

filename = "=?UTF-8?B?"

+ new BASE64Encoder().encode(filename.getBytes("utf-8"))

+ "?=";

} else { // IE及其他浏览器

filename = URLEncoder.encode(filename, "utf-8");

}

return filename;

}


文件下载案例

jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'index.jsp' starting page</title>

</head>

<body>
	<a href="${pageContext.request.contextPath}/download?filename=a.txt">a.txt</a>
	<br>
	<a href="${pageContext.request.contextPath}/download?filename=捕获.png">捕获.png</a>
	<br>
</body>
</html>

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>
	<constant name="struts.custom.i18n.resources" value="message"></constant>
	<constant name="struts.multipart.maxSize" value="20971520"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<action name="download" class="com.sihai.action.DownloadAction">
			<result type="stream">
				<param name="contentType">${contentType}</param> <!-- 调用当前action中的getContentType()方法 -->
				<param name="contentDisposition">attachment;filename=${downloadFileName}</param>
				<param name="inputStream">${inputStream}</param><!-- 调用当前action中的getInputStream()方法 -->
			</result>
		</action>
	</package>
</struts>

package com.sihai.action;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.struts2.ServletActionContext;

import com.sihai.utils.DownloadUtils;

import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport {

	private String filename; // 要下载文件的名称

	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}

	// 设置下载文件mimeType类型
	public String getContentType() {

		String mimeType = ServletActionContext.getServletContext().getMimeType(
				filename);
		return mimeType;
	}

	// 获取下载文件名称
	public String getDownloadFileName() throws UnsupportedEncodingException {

		return DownloadUtils.getDownloadFileName(ServletActionContext
				.getRequest().getHeader("user-agent"), filename);

	}

	public InputStream getInputStream() throws FileNotFoundException,
			UnsupportedEncodingException {

		filename = new String(filename.getBytes("iso8859-1"), "utf-8"); // 解决中文名称乱码.

		FileInputStream fis = new FileInputStream("d:/upload/" + filename);
		return fis;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("进行下载....");
		return SUCCESS;
	}

}



分享到:
评论

相关推荐

    Struts2视频教程

    - **文件上传与下载**:Struts2内置了对文件上传的支持,可以轻松实现文件上传功能;同时也可以配置下载功能,满足文件分发的需求。 - **权限控制**:利用拦截器实现细粒度的权限控制,确保只有授权用户才能访问敏感...

    Struts2-2.3.16 全jar包

    commons-fileupload-1.2.1.jar//文件上传时用的,为了以后用到,最好加入 commons-io-1.3.2.jar//同上 commons-logging-1.0.4.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar struts2-core-2.2.1.1....

    STRUTS2 教程 --希望能够对大家有所帮助

    11. **插件**:Struts2有许多内置插件,如Ajax支持、JSON支持、文件上传等,扩展了框架的功能。 12. **SSH整合**:SSH(Spring+Struts2+Hibernate)是Java Web开发的经典组合。Spring负责依赖注入和事务管理,...

    Struts2技术手册-Struts2精华教程-电子书

    本书内容非常全面,涵盖了众多书籍所有知识要点,并结合作者自己经验总结而编写,内容相当丰富,是查找技术的...文件上传 .....文件下载 .....插件_JSON .....插件_DOJO .....插件_convention .....插件_config-browser

    Struts2文件上传和下载教程

    ### Struts2文件上传与下载教程 #### 一、文件上传原理及实现 **1.1 基础概念** 文件上传是Web开发中的常见需求之一。在Struts2框架中,实现文件上传主要依赖于表单的`enctype`属性设置为`multipart/form-data`。...

    struts2.3.1.2-all

    3. 示例代码:提供了一系列工作示例,展示了如何在实际项目中应用Struts2的各种功能,如表单验证、文件上传、国际化等。 4. FAQ和最佳实践:解答了常见问题,并提供了开发中的最佳实践建议。 通过Struts2.3.1.2-all...

    struts2教程(完全版)

    本教程将深入讲解Struts2的基础知识,帮助初学者快速掌握这一强大的框架。 一、Struts2的准备工作 1. **安装与实例**: 在开始使用Struts2之前,需要下载Struts2的发行包,例如`struts-2.1.6-all.zip`。解压缩后...

    struts2教程-学习笔记.zip

    此外,可能还会涉及Action结果、国际化、异常处理和文件上传下载等特性。 "struts2学习笔记.doc"可能是一位经验丰富的开发者编写的个人学习笔记,其中可能包含了一些实用技巧、常见问题解决方案以及项目实践中的...

    Struts2的文件上传下载.rar

    这篇教程将带你了解如何在Struts2中实现文件上传和下载,并涉及到国际化(i18n)的应用。 1. **文件上传**: - **配置Struts2 Action**: 首先,你需要创建一个Action类,这个类将处理文件上传的请求。使用`@Action...

    Struts2入门教程.pdf

    - **文件上传**:Struts2提供了文件上传的支持,开发者可以通过简单的配置即可实现文件的上传功能。 - **文件下载**:同样地,Struts2也支持文件下载,便于实现文件的分发和共享。 #### 十、视图浅析 - **视图组件...

    简单易懂的struts2文件上传

    本教程将深入浅出地讲解如何在Struts2中实现文件上传,并提供一个简单的实例来帮助理解。 1. **Struts2文件上传概述** 在Struts2中,文件上传主要依赖于Apache的Commons FileUpload库。这个库提供了处理HTTP多部分...

    struts2文件上传教程

    本教程将详细介绍如何在Struts2中实现文件上传。 首先,我们需要在项目的WEB-INF目录下添加两个关键的库文件:`commons-fileupload-1.2.1.jar` 和 `commons-io-1.3.2.jar`。这些文件是Apache Commons项目的一部分,...

    传智播客struts2教程

    学习Struts2不仅需要理解这些基本概念,还要掌握Action的生命周期、拦截器链的工作原理、国际化处理、文件上传下载等功能。此外,整合Spring框架以实现依赖注入,以及与Hibernate等ORM框架集成进行数据库操作,也是...

    Struts2教程DOC版

    3. **文件上传与下载**:Struts2提供了便捷的文件上传和下载功能,包括文件大小限制、类型检查等。 4. **Ajax支持**:Struts2可以与jQuery等库配合,实现异步更新视图,提升用户体验。 5. **Exception Handling**...

    struts2教程pdf清晰版

    “9 file upload.pdf”可能讲解文件上传功能,包括如何处理multipart请求,以及Struts2提供的FileUpload拦截器和Result类型。 最后,“10 crud.pdf”可能是一个综合案例,演示如何使用Struts2实现基本的创建...

    struts2.1教程

    - **文件上传与下载**: - 利用FileUpload拦截器实现文件上传功能。 - 设计Action处理文件存储和访问逻辑。 - 支持大文件上传和断点续传等功能。 #### 四、Struts 2.1 高级特性 - **拦截器**: - 创建自定义...

    struts2 文件上传 教程

    在这个"Struts2文件上传教程"中,我们将深入探讨如何在Struts2环境中实现文件上传功能。 文件上传在web应用中很常见,例如用户可能需要上传头像、提交文档或分享图片。在Struts2中,这个过程涉及到几个关键组件和...

Global site tag (gtag.js) - Google Analytics