Struts2 文件的上传与下载
1. Struts2的文件上传需要Apache的commons-io-Version.jar和commons-fileupload-Version.jar两个jar包。
2. 页面中的<s:file name="example"/>标签会在相应的action类中寻找并执行三个setter方法:setExample,setExampleFileName和setExampleContentType。其中setExampleFileName方法将用户上传的文件的文件名(String,不包括文件路径)赋给action类的相应属性,setExampleContentType方法则对应上传文件的MIME类型(String),如"text/plain"。
3. 对上传文件最主要的处理就是完成文件的拷贝,具体做法是使用文件字节输出流将用户上传的文件写到某个目录下。
4. Struts2上传文件需要使用fileUpload拦截器,这个拦截器包含在defaultStack拦截器栈里,相应的拦截器类为org.apache.struts2.interceptor.FileUploadInterceptor。该拦截器有三个常用属性:maximumSize,allowedExtensions和allowedTypes,分别代表允许上传文件的大小的最大值,允许上传的文件后缀名和允许上传的文件MIME类型,多个项之间用逗号分隔。
注意:手动在<interceptor-ref>元素中配置fileupload拦截器后不要忘记紧接着添加defaultStack拦截器栈,因为此时defaultStack拦截器栈将不会被容器自动引用,必须手动添加上。
5. struts.multipart.saveDir用于指定存放临时文件的文件夹,该配置写在struts.properties文件中。可以使用struts.xml文件中的constant元素来覆盖默认的位置,例如
<constant name="struts.multipart.saveDir" value="C:\"></constant>
上面这行代码指定了C盘根目录为临时文件夹。
6. 通过重写国际资源文件中struts.messages.error.content.type.not.allowed键和struts.messages.error.file.too.large键对应的值,可以实现自定义出错信息。例:
struts.xml文件:
<!-- 在struts.xml文件中使用constant元素指定在全局的message.properties文件中自定义出错信息 -->
<constant name="struts.custom.i18n.resources" value="message"></constant>
message.properties文件:
<!-- 自定义上传文件类型不允许时的提示信息-->
struts.messages.error.content.type.not.allowed = Error: the file type is not allowed, please try again <!-- 自定义上传文件过大时的提示信息-->
struts.messages.error.file.too.large = Error: the file is too large, please try again
注意:message.properties文件应该位于WEB-INF/classes目录下。
7. 上传多个文件时,只要将相关action类中的属性变为数组类型或者List类型即可,struts会自动用文件上传页面表单中的信息填充。但要注意表单中多个file标签的name必须相同。若上传页面如下:
<!-- 上传多个文件时,file标签的name属性必须一致-->
file1:<s:file name="file">
file2:<s:file name="file">
file3:<s:file name="file">
相应的action类如下:
//上传多个文件时对应的动作类
public class UploadAction extends ActionSupport {
private List<File> file;
....
}
则struts会自动将上传的三个文件都放入action类的成员变量file中,因为上传页面中三个file标签的name属性都是file!
8.
Struts中的文件下载非常便捷,只需编写一个相应的action即可,提供一个返回InputStream流的方法,该输入流代表了被下载文件的入
口,这个方法用来给被下载的数据提供输入流,意思是从这个流读出来,再写到浏览器那边供下载。这个方法由开发人员编写,只需要返回值为
InputStream即可。
9. 文件下载的结果类型为stream,相应的类为org.apache.struts2.dispatcher.StreamResult。该结果类型有三个常用属性:contentType,contentDisposition和inputName。
contentType表示被下载文件的MIME类型,默认为text/plain。
contentDisposition表示下载文件的处理方式,有inline(默认)和attachment两种。若指定为inline模式,浏览器会先尝试直接打开文件,无法直接打开则弹出保存对话框;attachment模式则直接弹出文件保存对话框。语法格式为:<param>attachment;filename="example.txt"</param>。这时,无论服务器端真真被下载的文件名字是什么,文件保存对话框中显示的文件名都是example.txt。
inputName表示下载文件的来源流。若inputName取值为downloadFile,则在相应的action类中必须有一个返回类型为InputStream的getDownloadFile方法来返回下载的文件入口,参考第8点。
result配置实例:
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="contentDisposition">attachment;filename="example.txt"</param>
<param name="inputName">downloadFile</param>
</result><em><span style="font-size: 10pt; color: #0000ff;"><br></span></em>
10. 如果是未知的文件类型,或者说出现了浏览器不能打开的文件,例如.bean文件,或者说这个action是用来做动态文件下载的,事先并不知道未来的文件类型是什么,那么我们可以把contentType的值设置成为:application/octet-stream;charset=ISO8859-1 ,注意一定要加入charset,否则某些时候会导致下载的文件出错;有人说这时也可以设置成为application/x-download,根据笔者的实践,这个头也能正常工作,然而个别时候会出现浏览器无法识别的问题。
11. 文件名中包含中文的处理方法:
利用String nameInCN = String(“struts2中文.txt”.getBytes(), "ISO8859-1");的办法可以将struts2中文.txt转换为一个浏览器支持的字符串nameInCN,然后将这个字符串放置到<param>attachment;filename="..."</param>中区就可以了。
具体的操作方法可以参考这篇文章:Struts 2中实现文件下载(修正中文问题)
掌握了这个原理后,不难提出一些较上面那篇文章中所述更为简单的方法。下面是我自己想出的一个方法:
首先,依然要在相应action类中增加一个String类型的成员变量表示需要显示的文件名,这里不妨命名为filenameInCN。然后别忘了生成它的setter和getter方法。
其次,在struts.xml文件中配置相应的action的时候,向action传递一个参数,用以指定你希望显示给客户的文件名,当然,这个文件名
是可以包含中文的,我们接下来要做的就是将这个包含中文的文件名做一些修改使浏览器可以显示它。这里我们结社指定的文件名为“中文.txt”具体配置请参
考下面的代码。
接下来,修改action类中的setFilenameInCN方法,在这个方法里,我们使用上文所提及的办法将从配置文件中传过来的包含中文的文件名转换为浏览器可以识别的字符串。
最后,在配置文件的result元素中设置contentDisposition属性为attachment;filename="${filenameInCN}"即可。
好了,大功告成!现在用户在下载文件的时候,看到的就不再是一对乱码了,而是“中文.txt”。下面是上文所涉及的一些代码。
struts.xml文件中配置action,这里action的名字叫download:
<action name="download" class="com.test.action.DownloadAction">
<param name="filenameInCN">中文.txt</param>
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="contentDisposition">attachment;filename="${filenameInCN}"</param>
<param name="inputName">downloadFile</param>
</result>
</action>
下面是相应的DownloadAction 类,这里我们可以看到,被下载的文件实际上是服务器端WebRoot/abc目录下的bls.txt文件,但由于我们在action配置中指定了文件名为 “中文.txt”并做了相应的处理,所以用户在下载的时候看到的文件名就是“中文.txt”,而不是bls.txt,参考第9点。
import java.io.InputStream; import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext; public class DownloadAction extends ActionSupport {
private String filenameInCN; public String getFilenameInCN() {
return filenameInCN;
} public void setFilenameInCN(String filenameInCN) {
try {
this.filenameInCN = new String(filenameInCN.getBytes(), "ISO-8859-1");
} catch (Exception e) {
e.printStackTrace();
}
} public InputStream getDownloadFile() {
return ServletActionContext.getServletContext().getResourceAsStream("/upload/bls.txt");
} @Override
public String execute() throws Exception {
return SUCCESS;
}
}
Struts2 文件的上传与下载的更多相关文章
- Struts2 - 文件的上传和下载
1. 前言 这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 2. 具体内容 回到顶部 2.1Struts2文件上传 2.1.1单 ...
- Struts2文件的上传和下载实现
<一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...
- java实现文件的上传和下载
1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...
- JSP文件的上传和下载
文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...
- java实现ftp文件的上传与下载
最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...
- 在SpringMVC框架下实现文件的 上传和 下载
在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...
- SecureCRT使用sz和rz命令进行文件的上传和下载
SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...
- 使用FTPClient进行文件服务器内文件的上传和下载
我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...
- iOS开发中文件的上传和下载功能的基本实现-备用
感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...
随机推荐
- [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)
无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...
- Unity三种截屏方法(非自带API)
者利用了三种表现形式: 1,选择截图路径的方法 2,直接截取截屏的方法 3,截取鼠标圈选区域. 上代码,: 第一种是调用.net的类库,需要引用System.Windows.Forms.dll,在As ...
- android之interpolator的用法详解
Android:interpolator Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repea ...
- php导出excel不断刷新缓冲区的思路(转)
require('./db.class.php');$DB = new db();$DB->connect();//数据库链接 header("Content-Type: text/c ...
- Tcpdump命令行 与 GUI Wireshark
http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html tcpdump host 192.168.1.26 and \(192 ...
- visul svn+花生壳
1.服务器端 工具:visul svn+花生壳 花色壳:注册域名 visul svn:配置http://www.cnblogs.com/bluewelkin/p/3479105.html 外网访问,端 ...
- 八皇后问题 lua版
简单来讲就是如何在一个8x8的棋盘中放八个棋,让他们两两不能在同一行,同一列,同一斜线. 直接贴代码(出至:programming in lua 3 ) --棋盘大小 SIZE = --判断棋放在ro ...
- android 用代码画虚线边框背景(转)
1.虚线画效果,可以使用Android中的xml来做. 2.直接上代码: <RelativeLayout android:id="@+id/coupon_popup" and ...
- 鼠标双击范围基于Win7
TP鼠标双击范围主要是修改Registry中的HKEY_CURRENT_USER\Control Panel\Mouse里面的两个参数 DoubleClickHeight跟DoubleClickWid ...
- 在/etc/password用户名前面加hello,ID前加is
方法2: #!/bin/sh #set -x file=/etc/passwd while read LINE #for i in `cat $file` do #username=`echo $i| ...