Struts2 上传下载文件

目录结构-----------------------------------------------------------------------------------------

1.上传工具类

package org.usc.utils;
import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;

/**
 * @Desc:动态读取配置文件类</br>
 * @Filename:UploadConfigurationRead.java</br>
 * @Author:jwdstef</br>
 * @Date:2012-6-13下午03:24:41</br>
 */
public class UploadConfigurationRead {

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

	/**
	 * 配置文件路径
	 */
	private URI uri = null;

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

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

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

	/**
	 * 唯一实例
	 */
	private static UploadConfigurationRead m_instance = new UploadConfigurationRead();

	/**
	 * 私有构造函数
	 * 
	 * @throws URISyntaxException
	 */
	private UploadConfigurationRead() {
		try {
			m_lastModifiedTime = getFile().lastModified();
			if (m_lastModifiedTime == 0) {
				System.err.println(PFILE + "file does not exist!");
			}
			m_props = new Properties();
			m_props.load(new FileInputStream(getFile()));

		} catch (URISyntaxException e) {
			System.err.println(PFILE+"文件路径不正确");
			e.printStackTrace();
		} catch (Exception e) {
			System.err.println(PFILE+"文件读取异常");
			e.printStackTrace();
		}
	}

	/**
	 * 查找ClassPath路径获取文件
	 * 
	 * @return File对象
	 * @throws URISyntaxException
	 */

	private File getFile() throws URISyntaxException {
		URI fileUri = this.getClass().getClassLoader().getResource(PFILE).toURI();
		m_file = new File(fileUri);
		return m_file;
	}

	/**
	 * 静态工厂方法
	 * 
	 * @return 返回ConfigurationRead的单一实例
	 */
	public synchronized static UploadConfigurationRead getInstance() {
		return m_instance;
	}

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

	/**
	 * 读取一特定的属性项
	 * 
	 * @param name
	 *            属性项的项名
	 * @return 属性项的值(如此项存在), 空(如此项不存在)
	 */
	public String getConfigItem(String name) {
		return getConfigItem(name, "");
	}

}

2.上传action

package org.usc.file;

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 org.usc.utils.UploadConfigurationRead;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @Desc:多文件上传工具类</br>
 * @Filename:UploadAction.java</br>
 * @Author:jwdstef</br>
 * @Date:2012-6-13下午03:26:23</br>
 */
public class UploadAction extends ActionSupport
{
	private static final long serialVersionUID = 1L;
	// 实际上传文件
	private File upload;
	// 文件的内容类型
	private String uploadContentType; 
	// 上传文件名
	private String uploadFileName; 
	private List<UploadFiles> uploadFiles = new ArrayList<UploadFiles>();

	public String execute() throws Exception
	{
		try
		{
			String targetDirectory = ServletActionContext.getServletContext()
					.getRealPath("/"+ UploadConfigurationRead.getInstance().getConfigItem("uploadFilePath").trim());// 获得路径
			    // 上传的文件名
				String fileName = uploadFileName;
				// 文件类型
				String type = uploadContentType;
				// 保存的文件名称,使用UUID+后缀进行保存
				String realName = UUID.randomUUID().toString()+ getExt(fileName);

				File target = new File(targetDirectory, realName);
				// 上传至服务器的目录
				FileUtils.copyFile(upload, target);
				// 在把路径写入数据库即可

				// 创建文件
				UploadFiles uf = new UploadFiles();
				uf.setUploadContentType(type);
				uf.setUploadFileName(fileName);
				uf.setUploadRealName(realName);

				uploadFiles.add(uf);// 添加到需要下载文件的List集合中

			ServletActionContext.getRequest().setAttribute("uploadFiles",
					uploadFiles);

		} 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 static String getExt(String fileName)
	{
		return fileName.substring(fileName.lastIndexOf("."));
	}

}

3.上传文件pojo

package org.usc.file;

/**
 * @Desc:上传文件工具VO类</br>
 * @Filename:UploadFiles.java</br>
 * @Author:jwdstef</br>
 * @Date:2012-6-13下午03:23:36</br>
 */
public class UploadFiles
{
    //上传的文件名称
	private String uploadFileName;
	//类型
	private String uploadContentType;
	//保存的文件真实名称,UUID
	private String uploadRealName;
	//如果使用数据库的话,建议这三个字段都进行保存
	public String getUploadFileName()
	{
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName)
	{
		this.uploadFileName = uploadFileName;
	}
	public String getUploadContentType()
	{
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType)
	{
		this.uploadContentType = uploadContentType;
	}
	public String getUploadRealName()
	{
		return uploadRealName;
	}
	public void setUploadRealName(String uploadRealName)
	{
		this.uploadRealName = uploadRealName;
	}
	
	
}

4.下载action

package org.usc.file;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.usc.utils.UploadConfigurationRead;

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

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

		fileRealName = new String(fileRealName.getBytes(), "ISO-8859-1");

		return fileRealName;
	}

	/*
	 * @getDownloadFile 此方法对应的是struts.xml文件中的: <param
	 * name="inputName">downloadFile</param> 返回下载文件的流,可以参看struts2的源码
	 */
	public InputStream getDownloadFile()
	{

		this.setFileName();
		return ServletActionContext.getServletContext().getResourceAsStream("/"+UploadConfigurationRead.getInstance().getConfigItem("uploadFilePath").trim()+"/" + fileName);
	}

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

5.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.multipart.maxSize = 633542440

6.struts配置文件
<?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="org.usc.file.UploadAction">
			<result name="input">/upload.jsp</result>
<!--			<result name="success">/upload_success.jsp</result>-->
			<result name="success">/download.jsp</result>
			<interceptor-ref name="fileUpload">
<!--大家可以设置成自己的配置,想文件类型和大小等限制			-->
<!--  			<param name="maximumSize">633542440</param>	-->
<!--  			 <param name="allowedTypes">application/vnd.ms-excel</param>  -->	
<!--				-->
<!--					容许文件类型为doc,ppt,xls,pdf,txt,java-->
<!--				-->
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
		</action>

		<action name="download" class="org.usc.file.DownloadAction">
			<result name="success" type="stream">
				<param name="contentDisposition">attachment;filename="${fileName}"</param>
				<param name="inputName">downloadFile</param>
			</result>
		</action>
	</package>
</struts>
7.upload.properties上传文件路径文件

uploadFilePath=upload/file
上传到项目对应的webroot的upload文件下的file文件中
8.上传文件jsp页面

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
	<head>
		<title>upload</title>

	</head>
	<body>
		<script type="text/javascript">
		
		<s:form action="upload.action" theme="simple" method="post"
			enctype="multipart/form-data">

			<table align="center" width="50%" border="1">
				<tr>
					<td>
						上传文件
					</td>
					<td id="more" >
						<s:file name="upload"></s:file>
					</td>
				</tr>
				<tr>
					<td>
						<s:submit value=" 确认 "></s:submit>
					</td>
					<td>
						<s:reset value=" 重置 "></s:reset>
					</td>
				</tr>

			</table>

		</s:form>

	</body>


</html>

9.下载文件jsp页面

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
	<head>
		<title>download</title>
	</head>
	<body>
		<table align="center" width="50%" border="1">
			<tr>
				<td align="center">
					文件下载
				</td>
			</tr>
			<c:forEach var="uploadFiles" items="${uploadFiles}">
				<tr>
					<td>
						<a
							href="download.action?name=${uploadFiles.uploadRealName }&realname=${uploadFiles.uploadFileName }">${uploadFiles.uploadFileName
							}</a>
					</td>
				</tr>

			</c:forEach>


		</table>
	</body>
</html>

10.效果图



你可能感兴趣的:(Struts2 上传下载文件)