struts2实现文件的上传、下载
struts2能实现上传、下载是基于组件commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar。
表单元素的enctype属性,
表单的enctype属性指定的是表单数据的编码方式,该属性有如下3个值:
application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
text/plain:这种编码方式当表单的action属性为mailto:URL的形式时比较方便,这种方式主要适用于直接通过表单发送邮件的方式。
序:
我们根据例子来分析:
jsp页面:
<s:form action=”uploadAction”method=”post” enctype=”multipart/form-data”>
<s:label name=”file” /> <s:file />
<s:submit value=”上传” />
<s:form>
UploadAction :
public class UploadAction extends ActionSupport {
private String file;//这里的名字要和JSP参数名一样,(为了set方法);
private String fileFileName; //参数名+FileName,必须这样。保存文件真正的名字。
private String fileContentType; //参数名+ContentType,必须这样。保存文件真正的类型。
/*
* get/set方法
*/
public String execute() throws Exception {
//JSP的form将表单内容以二进制的形式传参给action。
//这时,action的file保存了上传的文件。
//获得file的路径
System.out.println(file.getAbsolutePath());
}
}
注:
上例,我机子上的运行结果如下:
文件上传后,struts2会先临时将这个文件保存起来,struts.multipart.saveDir 用来指定临时文件保存位置。struts.multipart.saveDir=null(没指定)的话会保存到服务器中的一个位置。
配置struts.multipart.saveDir有两种方式:
- 在struts.xml中配置,<constant name="struts.multipart.saveDir" value="/tmp"/>。
- 写个sturt.properties,struts.multipart.saveDir=/temp。
struts2默认上传文件最大是2M,我们可以修改配置文件来更改大小(以字节为单位)
- 在struts.xml中配置,<constant name="struts.multipart.maxSize" value="10701096"/>
- 在struts.properties中配置, struts.multipart.maxSize=10701096。
注:
在struts.properties中的配置都可以放到struts.xml中用constant配置。
好了,现在进入正题:
单个文件上传:
public String execute() throws Exception {
//在webRoot下建个文件夹,用来存放上传来的文件,“upload”。
//其实这个文件只是一个映射,真正保存文件的upload在Tomcat那里。
//获得Tomcat下upload的真实路径。
String realPath = ServletActionContext
.getRequest()
.getSession()
.getServletContext()
.getRealPath(“upload”);
//通过真实路径+真实文件名,完全将文件copy过来。
File theCopy = new File(realPath, fileFileName);
//输入流插到临时文件上,读数据。输入,输出,都是相对于程序。
InputStream is = new FileInputStream(file);
//输出流插到新文件上,写数据。
OutputStream os = new OutputStream(theCopy);
//一个缓冲字节数组。
byte[] buffer = new byte[];
int length=0;
//开始copy
while ( (length=is.read(buffer0)) != -1 ) {
os.write(buffer, 0, length);
}
}
//临时文件的删除?
多个文件上传:
多个文件的上传跟单个文件上传类似,只是操作的是一个集合而已。
例子如下:
jsp页面:
<s:from action=”upload” method=”post” enctype=”multipart/form-data”>
<! - - 上传的所有参数必须是一个名,struts将它们封装成一个集合-- >
<s:file name=”files”> <br />
<s:file name=”files”> <br />
<s:submit value=”上传” />
</s:form>
action:
public class UploadFileAction extends ActionSupport {
private List<File> files;
private List<String> filesFileName;
private List<String> filesContentType;
//get、set方法
public String execute( ) throws Exception {
String realpath = ServletActionContext
.getRequest()
.getSession()
.getServletContext()
.getRealPath("upload");
for(int i=0; i<files.size(); i++ ) {
File copy = new File(realpath, filesFileName.get(i) );
inputStream is = new FileInputStream ( files.get(i) );
OutputStream os = new FileOutputStream (copy );
byte[] buffer = new byte[];
int length = 0;
while( ( length =is.read(buffer) ) != -1 ) {
os.write( buffer, 0, length );
}
}
return SUCCESS;
}
}
文件下载:
action:
public class DownloadFileAction extends ActionSupport {
private String fileName;
private InputStream downloadFile;
//主要的方法
public InputStream getDownloadFile() {
try {
//模拟根据条件下载对应的文件
if( num == 1 )
//将制定的文件作为一个流返回出去;
return return ServletActionContext
.getServletContext()
.getResourceAsStream("/upload/xxoo.jpg");
else
//将制定的文件作为一个流返回出去;
return return ServletActionContext
.getServletContext()
.getResourceAsStream("/upload/jj.txt");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String getFileName() {
return this.fileName;
}
public String execute() throws Exception {
return SUCCESS;
}
}
struts配置
<struts >
<! – 指定,文件上传时临时文件的位置- - >
<constant name=”struts.multipart.saveDir” value=”/upload” />
<action name=”download” class=”action.DownloadFileAction” >
<!- - 要注意result的类型是stream - - >
<result name=”success” type=”stream” >
<!—inputName参数指定文件的源头,根据这个配置,找getDownloadFile方法获得文件流 - ->
<param name=”inputName”>downloadFile</param>
<!—指定下载的方式,默认的是inline,这种方式,浏览器如果能打开的文件的话,就直接打开,而不会下载(如.txt格式文件)。一般指定是attachment方式,让用户可以选择是打开还是下载。- - >
<param
name=”contentDisposition”>attachment;filename=”xxoo.jpg”</param>
<! – 如果想不写死文件的话,”xxoo.jpg”可以换成${fileName},action里必须提供fileName的get方法- - >
</result>
</struts>
jsp页面:
<a href = “download.action?num=1”>下载文件</a>
还可以指定文件的格式,缓冲大小,如:
<result name="success" type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">imageStream</param>
<param name="contentDisposition">attachment;filename="document.pdf"</param>
<param name="bufferSize">1024</param>
</result>
相关推荐
Struts2是一个强大的MVC(模型-视图-控制器)框架,广泛应用于Java ...以上就是使用Struts2框架实现文件上传下载的基本步骤和关键知识点。在实际开发中,可以根据项目需求进行调整和优化,确保功能的稳定性和安全性。
在Struts2中,文件上传主要依赖于`org.apache.struts2.components.FileUpload`组件,这个组件是基于Commons FileUpload库实现的,它能够处理multipart/form-data类型的HTTP请求,这是文件上传所必需的格式。...
以上是Struts2实现文件上传和下载的基本步骤和关键概念。在实际应用中,你可能还需要考虑性能优化、错误处理、用户体验等方面。阅读博文(https://chenzheng8975.iteye.com/blog/1733841)将为你提供更具体的实现...
总结起来,使用Struts实现文件上传下载涉及前端表单设计、后端处理逻辑、文件存储策略以及安全控制等多个方面。在实践中,我们还需要考虑到性能优化和用户体验提升,例如使用异步上传、进度条展示等技术。
网上的Struts2进行的文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子 提供多文件上传,上传成功后,提供刚上传的文件下载功能(其他的都可以在其上面进行扩充) 多文件 上传 下载...
通过以上步骤,你可以实现一个基于Struts2和Hibernate的文件上传与动态下载系统。这个系统能够处理用户上传的文件,将其保存到服务器,同时提供动态下载功能,允许用户根据需要下载文件。在实际开发中,还需要考虑...
在这个“Struts2实现文件上传”的主题中,我们将深入探讨如何利用Struts2框架来实现在Web应用中的文件上传功能。 首先,我们注意到一个细节描述:“private String uploadContextType;应更正为private String ...
描述中的链接指向了CSDN博主johnjobs的一篇文章,这篇文章详细解释了如何在Struts2中实现文件上传。博主可能讨论了以下关键点: 1. **配置Struts2 Action**:在`struts.xml`配置文件中,你需要定义一个Action,该...
在基于Struts2的文件上传下载功能中,它提供了处理用户上传文件和提供文件下载的服务。这个完整的源代码是实现这些功能的一个实例,经过测试确保了其正确性和可用性。 首先,我们要理解Struts2中的Action类。Action...
下面将详细阐述如何使用Struts2来实现文件上传功能。 1. **Struts2文件上传组件** Struts2框架集成了一个名为`struts2-convention-plugin`的插件,它提供了文件上传的支持。主要依赖于`Commons FileUpload`和`...
在本文中,我们将深入探讨使用Struts2实现文件上传和下载的各种方案。 ### 文件上传方案 #### 1. 使用Struts2进行文件普通上传 文件上传的核心是处理`multipart/form-data`类型的表单数据。Struts2通过`Struts2-...
Struts1和Struts2是两个非常著名的Java Web框架,它们都提供了处理文件上传和下载的功能,但实现方式有所不同。本文将深入探讨这两个框架在文件操作方面的具体实现。 首先,让我们了解一下Struts1中的文件上传功能...
本项目实现了使用Struts2进行文件批量上传的功能,这涉及到几个关键的技术点,包括文件上传组件的选择、前端表单设计、后端处理逻辑以及存储策略。 1. **文件上传组件**:在Struts2中,我们通常使用`Commons ...
在Struts1中实现文件上传和下载是常见的需求,这通常涉及到用户通过Web界面交互地上传文件到服务器,或者从服务器下载文件到本地计算机。 一、文件上传 1. **配置ActionForm**:首先,你需要创建一个继承自Struts...
以上是使用Struts2在Eclipse环境下实现文件上传和下载的基本步骤和关键知识点。具体实现可能需要根据项目需求进行调整,但这些指导原则能帮助你构建一个基本的文件管理功能。在实际项目中,务必注意代码的健壮性和...
在这个特定的项目中,我们关注的是"struts2文件上传下载"的功能,这涉及到用户通过Web界面上传文件到服务器,以及从服务器下载文件到用户的设备。 文件上传是Web应用中的常见需求,例如用户可能需要提交图片、文档...
在这个"struts实现文件上传和下载源代码"项目中,我们将会探讨如何使用Struts框架来实现在Web应用中进行文件的上传和下载功能,同时还会关注对于大文件(超过3MB)的处理策略。 1. **文件上传** 文件上传是Web应用...
在实现文件上传时,必须注意以下安全问题: 1. **文件类型检查**:限制上传的文件类型,防止恶意用户上传可执行文件或脚本。 2. **文件名重命名**:避免文件覆盖或路径遍历攻击,对上传的文件名进行重命名。 3. **...