1. Struts2的文件上传需要Apache的commons-io-Version.jarcommons-fileupload-Version.jar两个jar包。
2. 页面中的<s:file name="example"/>标签会在相应的action类中寻找并执行三个setter方法:setExamplesetExampleFileNamesetExampleContentType。其中setExampleFileName方法将用户上传的文件的文件名(String,不包括文件路径)赋给action类的相应属性,setExampleContentType方法则对应上传文件的MIME类型(String),如"text/plain"。
3. 对上传文件最主要的处理就是完成文件的拷贝,具体做法是使用文件字节输出流将用户上传的文件写到某个目录下。
4. Struts2上传文件需要使用fileUpload拦截器,这个拦截器包含在defaultStack拦截器栈里,相应的拦截器类为org.apache.struts2.interceptor.FileUploadInterceptor。该拦截器有三个常用属性:maximumSizeallowedExtensionsallowedTypes,分别代表允许上传文件的大小的最大值,允许上传的文件后缀名和允许上传的文件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。该结果类型有三个常用属性:contentTypecontentDispositioninputName
    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 文件的上传与下载的更多相关文章

  1. Struts2 - 文件的上传和下载

    1.  前言 这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 2.  具体内容 回到顶部 2.1Struts2文件上传 2.1.1单 ...

  2. Struts2文件的上传和下载实现

    <一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...

  3. java实现文件的上传和下载

    1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...

  4. JSP文件的上传和下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  5. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  6. 在SpringMVC框架下实现文件的 上传和 下载

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...

  7. SecureCRT使用sz和rz命令进行文件的上传和下载

    SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ...

  8. 使用FTPClient进行文件服务器内文件的上传和下载

    我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...

  9. iOS开发中文件的上传和下载功能的基本实现-备用

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

随机推荐

  1. [连载]JavaScript讲义(03)--- JavaScript面向对象编程

  2. 从零开始写一个Tomcat(叁)--请求解析

    挖坑挖了这么长时间也该继续填坑了,上文书讲到从零开始写一个Tomcat(贰)--建立动态服务器,讲了如何让服务器解析请求,分离servlet请求和静态资源请求,读取静态资源文件输出或是通过URLCla ...

  3. [转] nodeJS的post提交简单实现

    index.js: ? 1 2 3 4 5 6 7 8 var server = require('./server'); var router = require('./route'); var r ...

  4. MyISAM与InnoDB的区别

    1. 存储结构: MyISAM:(文件名以表名开始) .frm文件存储表定义 .MYD文件存储数据 .MYI文件存储索引 InnoDB: 所有的表保存在同一个(也可能多个)数据文件中,表的大小仅受限于 ...

  5. Adapter优化方案的探索

    概要:使用Adapter的注意事项与优化方案本文的例子都可以在结尾处的示例代码连接中看到并下载,如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request. ...

  6. android 用代码画虚线边框背景(转)

    1.虚线画效果,可以使用Android中的xml来做. 2.直接上代码: <RelativeLayout android:id="@+id/coupon_popup" and ...

  7. servlet中访问mysql无法包含中文的解决

    最近写servlet应用发现,如果我的sql语句中包含英文,访问数据库就失败,而我数据库的编码是utf8 -- UTF-8 Unicode,而我servlet的字符也已经转为UTF-8 ,还是不行. ...

  8. noip 2012 疫情控制

    /* 考试的时候没想出正解 也没打暴力 时间不够了 随便yy了几种情况按出现的先后顺序处理而没有贪心 的了20分 不粘了 正解是围绕首都的儿子来搞的 显然先二分答案 对于每个限定的最大时间 我们尝试着 ...

  9. 解决Windows8前面板耳机无声的问题

    Windows8已经到来不久了,相信很多朋友已经在使用,在使用时也许会遇到前面板耳机无声的问题,网上的其他办法很麻烦还不一定能解决,在这里我会给大家提供最简单的办法解决这个问题. 百度经验:jingy ...

  10. windows7在局域网中无法映射驱动器问题解决

    昨天下班时闲的蛋疼,因电脑比较慢,因此在计算机的[系统配置中]的启动选项下对[启动项目]和[服务]做了误操作,导致在计算机重启之后声卡.显卡.网卡等许多服务禁用,更令人费解的是内网中断了连接,无法访问 ...