`

struts2 上传下载

 
阅读更多

upload.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
	<title>upload</title>
	<script type="text/javascript">
		//addMore函数可以提供上传多个文件上传
		function addMore(){
			var td = document.getElementById("more");
			var br = document.createElement("br");
			var input = document.createElement("input");
			var button = document.createElement("input");
			input.type = "file";
			input.name = "upload";
			button.type = "button";
			button.value = "删除";
			button.onclick = function(){
				td.removeChild(br);
				td.removeChild(input);
				td.removeChild(button);
			};
			td.appendChild(br);
			td.appendChild(input);
			td.appendChild(button);
		}
</script>
	<body>
		<!--<h3><font color="red">上传文件类型后缀为doc,ppt,xls,pdf,txt,java,每个文件大小不能大于50M</font></h3>-->
		<table align="center" width="50%">
			<tr>
				<td>
					<s:fielderror cssStyle="color:red" />
				</td>
			</tr>
		</table>
		
		<s:form action="upload" theme="simple" method="post" enctype="multipart/form-data">
			<table align="center" border="0">
				<tr>
					<td>上传文件</td>
					<td id="more">
						<s:file name="upload"></s:file>
						<input type="button" value="上传更多..." onclick="addMore()">
					</td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<s:submit value="确认"></s:submit><s:reset value="重置"></s:reset>
					</td>
				</tr>
			</table>
		</s:form>
	</body>
</html>

 download.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
	<head>
		<title>download</title>
	</head>
	<body>
		<s:iterator value="uploadFiles" var="uploadFile">
			<a href="download?realFileName=<s:property value='#uploadFile.uploadRealFileName'/>&fileName=<s:property value='#uploadFile.uploadFileName'/>">
				<s:property value="#uploadFile.uploadFileName" /> 
			</a>
			<br>
		</s:iterator>
	</body>
</html>

 

upload_success.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
	<head>
		<title>上传成功</title>
	</head>
	<body>
		<table>
			<tr>
				<td colspan="2"><h1>上传成功</h1></td>
			</tr>
			<tr>
				<td width="120">文件的内容类型:</td>
				<td><s:property value="uploadContentType" /></td>
			</tr>
			<tr>
				<td>上传文件名:</td>
				<td><s:property value="uploadFileName" /></td>
			</tr>
			<tr>
				<td>临时文件:</td>
				<td><s:property value="upload" /></td>
			</tr>
		</table>
	</body>
</html>

 

UploadAction.java

package com.test.struts2.action;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.test.struts2.model.UploadFile;
import com.test.struts2.utils.UploadConfiguration;

/**
 * 多文件上传类
 */
public class UploadAction extends ActionSupport {

	/**
	 * 查看struts2源码,变量uploadContentType和uploadFileName的前缀"upload"和变量upload要一致
	 */
	private File[] upload;// 临时文件
	private String[] uploadContentType; // 文件的内容类型(不是文件名的后缀)
	private String[] uploadFileName; // 上传文件名
	private List<UploadFile> uploadFiles = new ArrayList<UploadFile>();

	public String execute() throws Exception {
		try {
			String targetDirectory = ServletActionContext.getServletContext().getRealPath("/" + UploadConfiguration.getInstance().getConfigItem("uploadFilePath").trim());// 获得路径
			for (int i = 0; i < upload.length; i++) {
				String fileName = uploadFileName[i];// 上传的文件名
				String contentType = uploadContentType[i];// 文件的内容类型
				// 保存的文件名称,使用UUID+后缀进行保存
				String realFileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));
				File target = new File(targetDirectory, realFileName);
				// 上传至服务器的目录,一般都这样操作
				FileUtils.copyFile(upload[i], target);
				// 这里可以把路径保存到数据库表中
				UploadFile uploadFile = new UploadFile();
				uploadFile.setUploadContentType(contentType);
				uploadFile.setUploadFileName(fileName);
				uploadFile.setUploadRealFileName(realFileName);
				// 添加到需要下载文件的List集合中
				uploadFiles.add(uploadFile);
			}
		} catch (Exception e) {
			e.printStackTrace();
			addActionError(e.getMessage());
			return INPUT;
		}
		return SUCCESS;
	}

	public File[] getUpload() {
		return upload;
	}

	public void setUpload(File[] upload) {
		this.upload = upload;
	}

	public String[] getUploadContentType() {
		return uploadContentType;
	}

	public void setUploadContentType(String[] uploadContentType) {
		this.uploadContentType = uploadContentType;
	}

	public String[] getUploadFileName() {
		return uploadFileName;
	}

	public void setUploadFileName(String[] uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	public List<UploadFile> getUploadFiles() {
		return uploadFiles;
	}

	public void setUploadFiles(List<UploadFile> uploadFiles) {
		this.uploadFiles = uploadFiles;
	}

}

 

DownloadAction.java

package com.test.struts2.action;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import com.opensymphony.xwork2.ActionSupport;
import com.test.struts2.utils.UploadConfiguration;

import org.apache.struts2.ServletActionContext;

public class DownloadAction extends ActionSupport {
	
	private String fileName;
	private String fileRealName;

	public void setFileName() {
		// 得到请求下载的文件名
		String realFileName = ServletActionContext.getRequest().getParameter("realFileName");
		String fileName = ServletActionContext.getRequest().getParameter("fileName");
		try {
			/*
			 * 对realFileName和fileName参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。
			 * 这里使用request.setCharacterEncoding解码无效.
			 * 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件
			 */
			realFileName = new String(realFileName.getBytes("ISO-8859-1"), "UTF-8");
			fileName = new String(fileName.getBytes("ISO-8859-1"), "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		}
		this.fileRealName = realFileName;
		this.fileName = fileName;
	}

	/*
	 * 此方法对应的是struts.xml文件中的: 
	 * <param name="contentDisposition">attachment;filename="${fileName}"</param>
	 * 这个属性设置的是下载工具下载文件时显示的文件名, 要想正确的显示中文文件名,
	 * 我们需要对fileName再次编码,否则中文名文件将出现乱码或无法下载的情况
	 */
	public String getFileName() throws UnsupportedEncodingException {
		fileName = new String(fileName.getBytes(), "ISO-8859-1");
		return fileName;
	}

	/*
	 * 此方法对应的是struts.xml文件中的: 
	 * <param name="inputName">downloadFile</param> 返回下载文件的流,可以参看struts2的源码
	 */
	public InputStream getDownloadFile() {
		this.setFileName();
		return ServletActionContext.getServletContext().getResourceAsStream("/" + UploadConfiguration.getInstance().getConfigItem("uploadFilePath").trim() + "/" + fileRealName);
	}

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
}

 

UploadFile.java

package com.test.struts2.model;

/**
 * 文件类,需要的时候,可以和数据库进行关联
 */
public class UploadFile {

	private String uploadFileName;// 上传的文件名称
	private String uploadRealFileName;// 保存的文件真实名称,UUID
	private String uploadContentType;// 文件的内容类型

	// 如果使用数据库的话,建议这三个字段都进行保存
	public String getUploadFileName() {
		return uploadFileName;
	}

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

	public String getUploadRealFileName() {
		return uploadRealFileName;
	}

	public void setUploadRealFileName(String uploadRealFileName) {
		this.uploadRealFileName = uploadRealFileName;
	}

	public String getUploadContentType() {
		return uploadContentType;
	}

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

}

 

upload.properties

uploadFilePath=upload/file

 

UploadConfiguration.java

package com.test.struts2.utils;

import java.io.File;
import java.io.FileInputStream;
import java.net.URISyntaxException;
import java.util.Properties;

/**
 * 动态读取配置文件类
 */
public class UploadConfiguration {

	/**
	 * 属性文件全名,需要的时候请重新配置PFILE
	 */
	private static String PFILE = "upload.properties";

	/**
	 * 属性文件所对应的属性对象变量
	 */
	private long lastModifiedTime;

	/**
	 * 对应于属性文件的文件对象变量
	 */
	private File file;

	/**
	 * 属性文件所对应的属性对象变量
	 */
	private Properties properties;

	/**
	 * 唯一实例
	 */
	private static UploadConfiguration instance;

	/**
	 * 私有构造函数
	 */
	private UploadConfiguration() {
		try {
			file = new File(this.getClass().getClassLoader().getResource(PFILE).toURI());
			lastModifiedTime = file.lastModified();
			if (lastModifiedTime == 0) {
				System.err.println(PFILE + "file does not exist!");
			}
			properties = new Properties();
			properties.load(new FileInputStream(file));
		} catch (URISyntaxException e) {
			e.printStackTrace();
			System.err.println(PFILE + "文件路径不正确!");
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println(PFILE + "文件读取异常!");
		}
	}

	/**
	 * 静态工厂方法
	 * 
	 * @return 返回UploadConfiguration的单一实例
	 */
	public static UploadConfiguration getInstance() {
		if (instance == null) {
			instance = new UploadConfiguration();
		}
		return instance;
	}

	/**
	 * 读取一特定的属性项
	 */
	public String getConfigItem(String key, String defaultVal) {
		long newLastModifiedTime = file.lastModified();
		// 检查属性文件是否被修改
		if (newLastModifiedTime == 0) {
			// 属性文件不存在
			if (lastModifiedTime == 0) {
				System.err.println(PFILE + " file does not exist!");
			} else {
				System.err.println(PFILE + " file was deleted!!");
			}
			return defaultVal;
		} else if (newLastModifiedTime > lastModifiedTime) {
			try {
				properties.clear();
				properties.load(new FileInputStream(file));
			} catch (Exception e) {
				e.printStackTrace();
				System.err.println("文件重新读取异常!");
			}
		}
		lastModifiedTime = newLastModifiedTime;
		String value = properties.getProperty(key);
		if (value == null) {
			return defaultVal;
		} else {
			return value;
		}
	}

	/**
	 * 读取一特定的属性项
	 * 
	 * @param name 属性项的项名
	 * @return 属性项的值
	 */
	public String getConfigItem(String key) {
		return getConfigItem(key, "");
	}

}

 

struts.properties

#Whether Struts is in development mode or not
struts.devMode=true
#Whether the localization messages should automatically be reloaded
struts.i18n.reload=true
#Whether to reload the XML configuration or not
struts.configuration.xml.reload=true

 

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>

	<constant name="struts.i18n.encoding" value="utf8" />
	<package name="file" namespace="/" extends="struts-default">
	
		<action name="showUpload">
			<result>/upload.jsp</result>
		</action>
		
		<action name="upload" class="com.test.struts2.action.UploadAction">
			<result name="input">/upload.jsp</result>
<!--			<result name="success">/upload_success.jsp</result>-->
			<result name="success">/download.jsp</result>
			<interceptor-ref name="fileUpload">
			<!-- 限制文件大小 (单位是字节,2097152B=2*1024*1024=2M)-->
			<param name="maximumSize">2097152</param>
			<!-- 限制文件类型 -->
<!--			<param name="allowedTypes">image/bmp,image/x-png,image/png,image/gif,image/jpeg,image/jpg,image/pjpeg</param>-->
			<!-- 容许文件类型为doc,ppt,xls,pdf,txt,java-->
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
		</action>

		<action name="download" class="com.test.struts2.action.DownloadAction">
			<result name="success" type="stream">
				<param name="contentDisposition">attachment;filename="${fileName}"</param>
				<param name="inputName">downloadFile</param>
			</result>
		</action>
		
	</package>
	
</struts>

 

分享到:
评论

相关推荐

    struts2上传下载项目

    在"struts2上传下载项目"中,我们可以深入理解如何利用Struts2实现文件的上传与下载功能。 首先,上传功能在Web应用中十分常见,比如用户在注册时上传头像,或者提交文档等。在Struts2中,我们主要借助`struts2-...

    struts2上传下载

    ### Struts2上传下载功能详解 #### 一、引言 在Web开发中,文件上传下载是一项常见的需求,尤其在用户交互频繁的应用场景中。Struts2作为一款成熟且广泛使用的MVC框架,提供了简洁而强大的文件上传下载功能。本文...

    Struts2上传下载

    Struts2上传下载,可以更方便的让大家学习、使用

    struts2 上传下载模板

    这篇博客文章“Struts2 上传下载模板”可能提供了关于如何在Struts2框架中实现这一功能的详细教程。 首先,我们来讨论文件上传。在Struts2中,文件上传通常依赖于`Apache Commons FileUpload`库,它处理了文件的多...

    struts2上传下载+前端剪切图片

    在"struts2上传下载+前端剪切图片"这个主题中,我们将探讨Struts2框架如何处理文件上传和下载功能,以及如何在前端实现图片的剪切操作。 **文件上传**: 在Struts2中,文件上传主要依赖于Apache的Commons ...

    Struts2项目struts2 上传 下载 项目

    在这个“Struts2 上传下载项目”中,我们将深入探讨如何利用Struts2实现文件上传与下载功能,并结合MySQL数据库、DAO(数据访问对象)层以及MVC架构来构建一个完整的应用。 1. **Struts2框架基础** Struts2的核心...

    struts2文件上传下载源代码

    在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...

    struts2 上传下载代码及流程文档

    在Struts2中,实现文件上传和下载功能是常见的需求,这对于用户交互和数据交换至关重要。本文档将深入讲解Struts2中如何进行文件上传和下载的代码实现及其流程。 首先,我们需要理解Struts2文件上传的核心组件:`...

    struts2 上传下载组建Jar

    在Struts2框架中,处理文件上传和下载功能是必不可少的一部分,尤其是在用户需要交互式地提交或获取文件的场景下。在这个“struts2 上传下载组建Jar”中,主要包括了两个关键的第三方库:`commons-io-1.4.jar`和`...

    struts2上传下载实例

    在Struts2中,文件上传和下载是常见的功能需求,尤其对于处理用户提交的表单数据时,如上传图片、文档等。这个"struts2_上传下载"实例则涵盖了多种实现这些功能的方法。 首先,Struts2的文件上传依赖于Apache的...

    Struts2上传下载组件

    在Struts2中,上传和下载功能是常见的需求,特别是在处理用户交互和数据交换时。这个“Struts2上传下载组件”就是为了满足这种需求而设计的。让我们深入探讨一下这个组件的工作原理以及如何在实际项目中使用它。 ...

    Struts2 上传下载

    Struts2作为一款流行的Java Web框架,为开发者提供了丰富的功能,其中包括文件上传和下载的处理。在Struts2中,实现文件上传下载是一项常见的任务,它涉及到HTTP协议、MIME类型、临时文件处理以及流的读写等多个方面...

Global site tag (gtag.js) - Google Analytics