Struts2下多文件的上传与下载
目录
关键词
多文件 上传 下载 随意文件 java Struts2 单例 配置 动态读取 李顺利
写在前面
在网络上,对于Java处理文件上传和下载的技术比较多,而Struts作为一款优秀的框架也提供了非常方便的文件上传和下载,而网上的一些例程都非常的不全面,概括来:
1) 文件上传比较多,多文件上传少一点
2) 文件下载很少的,看似简单,实则不然
3) 文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子
最近也在研究一下文件的上传和下载,在整合网上、浪曦风中叶老师和自己的学习的思想,写了这个工程,提供给大家参考,所以的代码终在IE、FireFox、Chrome测试通过。
需求
1.能够对多个文件进行上传(可以选择上传文件个数,也即上传文件个数不定)
2.能够对上传路径进行配置文件(upload.properties)指定,使用了一些类似单例模式的静态代码块
3.对配置文件中的路径可以进行动态读取(不重启服务器)
4.Struts2进行下载处理,能对上传的所有文件进行下载(多个)
5.文件保存的名称UUID生成,不过显示并下载的名称都是原文件名称
(人性化,通过UploadFiles处理)
环境
最新的Struts2:struts-2.1.8、MyEclipse、Tomcat、IE、FireFox、Chrome
目录结构
重要文件的看点
web.xml
…
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
…
在web.xml中使用了最新的Struts2的中央处理器类org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,而不再是以前的org.apache.struts2.dispatcher.FilterDispatcher,FilterDispatcher在新版本Struts2中已经标注为过时了,请大家尽量使用最新的filter。
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="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">2097152</param>单位是字节 2M (2097152B) -->
<!-- <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="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>
就是文件上传和下载的一些Struts2配置,注意上传的时候,请引入
<interceptor-ref name="defaultStack"></interceptor-ref>,
下载的配置中注意:<param name="inputName">downloadFile</param>
其他的配置解释网上很多,不懂的可以先google学习一下。
UploadAction
在此文件中请注意文件数组的使用,因为是多文件
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;
/**
*多文件上传类
*
*@authorMZ
*
*@Time2009-11-24下午09:26:44
*/
publicclass UploadAction extends ActionSupport
{
/**
*
*/
privatestaticfinallongserialVersionUID = 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());// 获得路径
for (int i = 0; i < upload.length; i++)
{
String fileName = uploadFileName[i];// 上传的文件名
String type = uploadContentType[i];// 文件类型
String realName = UUID.randomUUID().toString()+ getExt(fileName);// 保存的文件名称,使用UUID+后缀进行保存
File target = new File(targetDirectory, realName);
FileUtils.copyFile(upload[i], 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());
returnINPUT;
}
returnSUCCESS;
}
public File[] getUpload()
{
returnupload;
}
publicvoid setUpload(File[] upload)
{
this.upload = upload;
}
public String[] getUploadContentType()
{
returnuploadContentType;
}
publicvoid setUploadContentType(String[] uploadContentType)
{
this.uploadContentType = uploadContentType;
}
public String[] getUploadFileName()
{
returnuploadFileName;
}
publicvoid setUploadFileName(String[] uploadFileName)
{
this.uploadFileName = uploadFileName;
}
publicstatic String getExt(String fileName)
{
return fileName.substring(fileName.lastIndexOf("."));
}
}
DownloadAction
在此文件中要注意public InputStream getDownloadFile()的名称在Struts2配置文件配置,返回的是一个InputStream类型的对象。
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;
publicclass DownloadAction extends ActionSupport
{
privatestaticfinallongserialVersionUID = 6329383258366253255L;
private String fileName;
private String fileRealName;
publicvoid 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");
returnfileRealName;
}
/*
* @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
{
returnSUCCESS;
}
}
UploadConfigurationRead
动态读取配置文件,借鉴网上的代码
package org.usc.utils;
import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
/**
*动态读取配置文件类
*
*@authorMZ
*
*@Time2009-11-24下午08:25:22
*/
publicclass UploadConfigurationRead {
/**
*属性文件全名,需要的时候请重新配置PFILE
*/
privatestatic String PFILE = "upload.properties";
/**
*配置文件路径
*/
private URI uri = null;
/**
*属性文件所对应的属性对象变量
*/
privatelongm_lastModifiedTime = 0;
/**
*对应于属性文件的文件对象变量
*/
private File m_file = null;
/**
*属性文件所对应的属性对象变量
*/
private Properties m_props = null;
/**
*唯一实例
*/
privatestatic UploadConfigurationRead m_instance = new UploadConfigurationRead();
/**
*私有构造函数
*
*@throwsURISyntaxException
*/
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路径获取文件
*
*@returnFile对象
*@throwsURISyntaxException
*/
private File getFile() throws URISyntaxException {
URI fileUri = this.getClass().getClassLoader().getResource(PFILE).toURI();
m_file = new File(fileUri);
returnm_file;
}
/**
*静态工厂方法
*
*@return返回ConfigurationRead的单一实例
*/
publicsynchronizedstatic UploadConfigurationRead getInstance() {
returnm_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;
} elseif (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;
}
}
/**
*读取一特定的属性项
*
*@paramname
* 属性项的项名
*@return属性项的值(如此项存在),空(如此项不存在)
*/
public String getConfigItem(String name) {
return getConfigItem(name, "");
}
}
工程结果截图
在IE(遨游)中多文件上传
在IE(遨游)中多文件下载
在Firefox中多文件上传
在Firefox中多文件下载
在Chrome中多文件上传
在Chrome中多文件下载
服务器中所以文件
提供原代码下载
http://usc.googlecode.com/files/FileUpLoadAndDownLoad.rar
实际上,这个还可以进行扩展,可以存取上传的文件名和路径到数据库中,再在UI(jsp)上面根据需求进行显示文件,并提供下载,仅抛下砖头了,其它的...如果有什么建议或意见可以通过Q:506817493 或 E:jsjmz@qq.com,大家一起交流。
相关推荐
需求 1.能够对多个文件进行上传(可以选择上传文件个...提供多文件上传,上传成功后,提供刚上传的文件下载功能(其他的都可以在其上面进行扩充) 多文件 上传 下载 随意文件 java Struts2 单例 配置 动态读取 李顺利
在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...
本篇文章将详细探讨如何在Struts2框架下实现文件的上传与下载。 首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在...
在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...
通过以上步骤,你可以实现一个基于Struts2和Hibernate的文件上传与动态下载系统。这个系统能够处理用户上传的文件,将其保存到服务器,同时提供动态下载功能,允许用户根据需要下载文件。在实际开发中,还需要考虑...
本文将详细讲解Struts2框架下三种不同的文件上传方式:copy模式、字节流上传和字符流上传。 1. Copy模式文件上传: Copy模式是Struts2提供的一种简单易用的文件上传方式。它通过Struts2的`FileUploadInterceptor`...
总的来说,"struts2异步多文件上传和下载"涵盖了Web开发中重要的文件操作功能,结合了Struts2的框架能力与前端技术,实现了高效、友好的用户体验。理解并掌握这些技术对于开发高质量的Java Web应用至关重要。在实际...
总之,这个项目实例为使用Struts2和Uploadify实现带进度条的多文件上传及下载功能提供了一个基础模板,对于学习和实践此类功能的开发者来说是一个有价值的参考。通过深入研究和理解这个项目的代码,可以提升对Struts...
Struts2是一个非常流行的Java Web框架,用于构建企业级应用...通过以上步骤,开发者可以在Struts2框架下实现文件上传和下载功能,满足用户对数据交换的需求。但一定要注意安全性和性能优化,以确保应用的稳定和健壮。
Struts2提供了完善的文件上传支持,让我们来详细探讨如何在Struts2中实现多文件上传。 首先,我们需要在Struts2的配置文件(struts.xml)中启用文件上传的支持。这通常涉及到添加`<constant>`标签来设置`struts....
下面将详细介绍如何利用SWFUpload与Struts2来实现多文件上传。 **一、SWFUpload组件介绍** SWFUpload 是一个JavaScript库,它利用Flash技术提供了一个高级的文件上传体验。它的主要特性包括: 1. **多文件选择**...
通过以上步骤,我们就完成了在Struts2框架下多文件上传的功能。在实际开发中,还需要考虑到安全性、性能优化等问题,比如限制文件类型、大小,以及防止文件覆盖等。同时,为了提高用户体验,可以加入进度条展示,使...
在Struts2中,文件上传和下载是常见的功能,对于用户交互和数据交换至关重要。这篇内容将深入讲解如何在Struts2中实现多文件的上传和下载。 1. **文件上传** 文件上传在Web应用中常常用于让用户提交各种类型的文件...
在Struts2框架中实现文件上传和下载功能,是Web开发中常见的需求。Struts2作为一个成熟的MVC框架,提供了简单的API和标记库来处理文件上传下载的业务逻辑。下面是基于给定文件内容的知识点详细说明。 ### Struts2...
Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括文件上传和下载。在Struts2中处理文件上传和下载是常见的需求,对于构建交互式的Web应用来说至关重要。以下将详细介绍Struts2中如何实现这两个...
Struts2是一个非常流行的...以上就是Struts2中文件上传与下载的基本实现,通过这些步骤,你可以实现用户在Web应用中上传和下载文件的功能。在实际项目中,还需要根据具体需求进行调整和优化,如错误处理、进度显示等。
在实际项目中,文件上传和下载功能是必不可少的,本实例将详细讲解如何在Struts2框架下实现单个文件及多个文件的上传与下载。 首先,我们需要在Struts2的配置文件(struts.xml)中添加相关的Action配置,以便处理文件...
Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括处理用户表单提交、进行文件上传和下载。在Web应用中,文件上传和下载是常见的需求,例如用户上传头像、下载文档等。Struts2通过其Action类和...