以上是在MyEclipse的存放位置
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" class="org.usc.file.UploadAction" method="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>
struts.properties配置如下图所示:
upload.properties配置可自己随意定义一个路径 如下图所示:
上传UploadAction.java代码如下:
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;
/**
* 多文件上传类
*
* @author
*
* @Time
*/
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 showUpload() {
return SUCCESS;
}
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集合中
// uploadRealName[i]=UUID.randomUUID().toString();
// System.out.println("uploadRealName:"+uploadRealName[i]);
// for(File file:upload)
// {
// System.out.println("filename:"+file.getName());
// }
// System.out.println("filename:"+fileName);
// System.out.println("Ext:"+getExt(fileName));
// System.out.println("Type:"+type);
// System.out.println(target.getPath());
}
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("."));
}
}
下载DownloadAction.java如下:
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;
}
}
UploadConfigurationRead.java如下:
package org.usc.utils;
import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
/**
* 动态读取配置文件类
*
* @author
*
* @Time
*/
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, "");
}
}
UploadFiles.java代码如下
package org.usc.file;
/**
* 文件类,需要的时候,可以和数据库进行关联
*
* @author
*
* @Time
*/
public class UploadFiles {
private String uploadFileName;// 上传的文件名称
private String uploadContentType;// 类型
private String uploadRealName;// 保存的文件真实名称,UUID
// 如果使用数据库的话,建议这三个字段都进行保存
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;
}
}
上传upload.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">
<!--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>
<!--<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.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>
<input type="button" value="上传更多..." onclick="addMore()">
</td>
</tr>
<tr>
<td>
<s:submit value=" 确认 "></s:submit>
</td>
<td>
<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"%>
<%@ 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>
输入地址:localhost:8080/struts2_0610_FileUpLoadAndDownLoad/showUpload.action
显示如下图所示:
上传之后:
相关推荐
在“struts2文件上传下载实例”中,我们将探讨如何在Struts2框架下实现文件的上传和下载功能,这对于许多Web应用程序来说是必不可少的特性。 首先,`pom.xml`文件是Maven项目对象模型的配置文件,它定义了项目的...
在Struts2中,文件上传和下载是常见的功能需求,对于用户交互和数据交换至关重要。以下是对这些知识点的详细阐述: 1. **文件上传**: 在Struts2中,文件上传主要依赖于`Commons FileUpload`库,它是一个Apache提供...
在基于Struts2的文件上传下载功能中,它提供了处理用户上传文件和提供文件下载的服务。这个完整的源代码是实现这些功能的一个实例,经过测试确保了其正确性和可用性。 首先,我们要理解Struts2中的Action类。Action...
本实例展示了如何在Struts2环境中实现几个关键功能:自定义过滤器、文件上传下载以及用户登录功能。这些功能是任何Web应用程序的基础组成部分,理解和掌握它们对于提升Web开发技能至关重要。 首先,我们来探讨...
总之,这个项目实例为使用Struts2和Uploadify实现带进度条的多文件上传及下载功能提供了一个基础模板,对于学习和实践此类功能的开发者来说是一个有价值的参考。通过深入研究和理解这个项目的代码,可以提升对Struts...
本实例主要探讨如何在Struts1中实现多文件上传功能,并结合Form中传递List类型的数据,这对于理解MVC模式下的文件处理和数据传递有重要作用。我们将深入讨论以下几个关键知识点: 1. **Struts1框架基础**: Struts...
Struts2作为一款流行的Java ...以上就是Struts2文件上传和下载的基本实现,但请根据实际情况调整代码,确保满足项目需求,例如安全性、性能优化等方面。希望这个实例能帮助你更好地理解和应用Struts2的文件操作功能。
在这个实例中,我们将深入探讨如何利用Struts2实现文件上传,并关注其配置细节。 首先,文件上传的核心类是`org.apache.struts2.servlet.multipart.FileUpload`,它是Struts2框架内置的多功能工具,可以处理HTTP...
在本篇中,我们将聚焦于Struts2中的文件上传、下载和删除功能,这些是Web应用中常见的需求。 1. 文件上传: 在Struts2中,文件上传主要依赖于`Commons FileUpload`库,它处理了多部分表单数据。首先,你需要在`...
在Struts2中,文件上传和下载是常见的需求,尤其对于处理用户交互和数据交换的Web应用来说。本篇文章将全面解析Struts2.0中的文件上传和下载流程。 ### 文件上传 文件上传的核心在于`multipart/form-data`编码类型...
总之,Struts2.0的文件上传涉及到Web开发的多个方面,包括HTTP协议、Servlet API、Struts2框架的拦截器机制以及服务器端的文件处理和验证策略。理解这一原理对于构建健壮且安全的Web应用至关重要。
总的来说,Struts2.0的文件上传功能使得开发者能够方便地在Web应用中集成这一功能,而了解其工作原理和最佳实践对于提升开发效率和保证应用安全至关重要。通过这个实例,初学者可以更好地掌握这一技术,并将其应用到...
总的来说,`uploadify+Struts2`的多文件上传实例提供了一种有效的解决策略,尤其是在处理浏览器兼容性和session问题上。通过深入理解和实践这些技术,开发者可以构建更加稳定、高效的文件上传功能。
这个“Struts2 文件上传和下载示例程序”是一个演示如何在Struts2中实现这两个功能的实例。 文件上传是Web应用程序中的一项重要功能,允许用户从本地计算机选择文件并将其传输到服务器。在Struts2中,这一过程涉及...
这份"最新Struts2开源实例代码以及Struts2源码"包含了Struts2框架的最新版本2.3.12的应用示例和源码,对于深入理解Struts2的工作机制和开发实践非常有帮助。 首先,我们来看`struts-2.3.12-apps.gz`,这个文件很...
在这个"WebUploader上传文件实例(Java Struts2版).zip"压缩包中,我们可以找到一个基于Java Struts2框架实现的WebUploader应用示例。 首先,WebUploader的核心特性在于其异步上传能力,通过Ajax技术实现在不刷新...
总之,这个项目是关于如何在Java Web环境中使用JSP和Struts2框架实现文件上传和下载功能的实例,同时也展示了如何通过Struts配置限制文件大小,以防止过大文件导致的服务器资源占用过高。通过对这些技术的深入理解和...
总之,理解和配置`struts.multipart.saveDir`是Struts2文件上传功能的基础,通过设置这个参数,可以确保上传过程的顺利进行,避免因为找不到临时存储位置而导致的运行时错误。同时,合理规划文件存储策略,结合其他...
这个实例中的代码将为你提供一个完整的流程,让你能够快速理解和实现Struts环境下的文件上传和下载。通过这个实例,你可以学习到如何在实际项目中处理文件操作,以及如何在Struts框架下有效地组织代码和配置。同时,...