转自:http://blog.csdn.net/Mark_LQ/article/details/49822821

10.1.1 文件上传基本案例

  第一步:上传组件依赖与commons-fileupload-1.3.1.jar和commons-io-2.2.jar。这两个文件可以从http://commons.apache.org/下载或struts解压缩包中获取。
  第二步:把form表单的enctype设置为:“multipart/form-data“,如下:

<form action="/Struts2Study/uploadFile.action" enctype="multipart/form-data" method="post">
文件:<input name="uploadFile" type="file"><br>
<input type="submit" value="上传文件">
</form>

  :enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
  默认地,表单数据会编码为 application/x-www-form-urlencoded。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)。

属性值 值描述
application/x-www-form-urlencoded 在发送前编码所有字符(默认)
multipart/form-data 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
text/plain 空格转换为 “+” 加号,但不对特殊字符编码。

  第三步:Action类中添加以下属性,表单中文件字段的名称name=”uploadFile”:

private File uploadFile;  // 对应form表单中上传输入框的name值
private String uploadFileContentType; // 上传文件类型ContentType固定写法
private String uploadFileFileName; // 上传文件名FileName固定写法 public String uploadFile() throws IOException {
/*
* struts2框架已经将上传的文件临时保存在uploadFile变量中,当action结束调用后,
* 临时保存的文件就会删除,所以需要借助文件工具类保存到磁盘上!
*/
/*
* 获取上下文(项目)下files目录的绝对路径。
* 考虑到:application.getRealPath(path)可以获取绝对路径
* 所以application -> ServletActionContext.getServletContext()
*/
String pathname = ServletActionContext.getServletContext().getRealPath("/files");
// 如果保存的路径不存在,则创建
File destDir = new File(pathname);
if (!destDir.exists()) {
destDir.mkdir();
}
// destDir表示parentDir
FileUtils.copyFile(uploadFile, new File(destDir, uploadFileFileName));
return "message";
}

  第四步:配置struts.multipart.saveDir常量
  Struts2中的struts.multipart.saveDir常量主要是用来设置上传文件的临时存放地址,而这个参数设置方法的不同对应的地址也不同。 如果访问量不是太大,空间足够,可以直接使用默认的临时地址。

1.如果没有设置struts.multipart.saveDir,那么将默认使用javax.servlet.context.tempdir指定的地址,javax.servlet.context.tempdir的值是由服务器来确定的,临时文件的名称类似于upload__1a156008_1373a8615dd__8000_00000001.tmp。
2.直接使用绝对地址(Linux为例)

 <constant name="struts.multipart.saveDir" value="/var/upload_temp_files"/>

  第五步:设置可上传文件的大小限制
  默认上传文件的最大值为 2097152字节,2M,如果上传的文件超过,则会报错。修改最大上传文件的大小:

<constant name="struts.multipart.maxSize" value=“10701096"/>

10.1.2 拦截器实现上传文件的过滤

  Struts2提供类一个文件上传的拦截器fileUpload,通过配置该拦截器可以实现上传文件的过滤。打开该拦截器所对应的类FileUploadInterceptor:

public class FileUploadInterceptor extends AbstractInterceptor {
protected Long maximumSize;
protected Set<String> allowedTypesSet = Collections.emptySet();
protected Set<String> allowedExtensionsSet = Collections.emptySet();
...
}

  可知配置fileUpload拦截器有3个参数:

- maximumSize:允许上传文件的大小限制,字节为单位
- allowedTypes:允许上传的文件类型,多个文件类型采用,分隔
- allowedExtensions:允许上传文件的后缀名

  当文件过滤失败后,添加错误信息到系统fildError域,转入到input视图,因此该action需要提供input视图。为了保证拦截器可以添加错误信息,action需要实现ValidationAware接口,可以直接基础ActionSupport类。
  (1)拦截器的配置如下:

<action name="uploadFile" class="com.markliu.day04.UploadFileAction" method="uploadFile">
<interceptor-ref name="fileUpload">
<param name="maximumSize">1024</param>
<param name="allowedTypes">image/bmp,image/jpg,image/png</param>
<param name="allowedExtensions">.bmp,.jpg,.png</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result name="message">/pages/day04/message.jsp</result>
<result name="input">/pages/day04/uploadfile.jsp</result>
</action>

  注意:fileUpload拦截器必须在defaultStack(默认)拦截器前面配置,Struts2会由上到下执行拦截器。
  (2)由于defaultStack拦截器栈中已经包含fileUpload拦截器,所以配置简化如下:

<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">1024</param>
<param name="fileUpload.allowedTypes">image/bmp,image/jpg,image/png</param>
<param name="fileUpload.allowedExtensions">.bmp,.jpg,.png</param>
</interceptor-ref>

  (3)修改显示国际化的错误信息:
  在上传文件处理的action所在包下创建资源文件:一个是中文ActionName_zh_CN.properties、一个是英文ActionName_en_US.properties。对于中文资源文件,需要特别注意:我们应使用Myeclipse自带的MyEclipse properties Editer编辑器来打开此资源文件,并在properties视图下进行编辑,这样它会把中文进行编码(我们切换到source视图下可以看到经编码后的中文)。 这一步非常重要,否则会出现乱码。
  可提供国际化资源文件的key值(FileUploadInterceptor中可查看)有:

struts.messages.error.uploading - a general error that occurs when the file could not be uploaded
struts.messages.error.file.too.large - occurs when the uploaded file is too large
struts.messages.error.content.type.not.allowed - occurs when the uploaded file does not match the expected content types specified
struts.messages.error.file.extension.not.allowed - occurs when the uploaded file does not match the expected file extensions specified
---------------------
说明:
怎么获取文件名称和文件类型呢?于是找了大量的资料发现:Strut2的Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性 无法获取上传文件的文件名和文件类型,所以Struts2就直接将文件域中包含的上传文件名和文件类型的信息封装到uploadFileName和 uploadContentType属性中,也就是说Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:
l 类型为File的xxx属性:用来封装页面文件域对应的文件内容。
l 类型为String的xxxFileName属性:用来封装该文件域对应的文件的文件名。
l 类型为String的xxxContentType属性:用来封装该文件域应用的文件的文件类型。
 
 
jsp页面
<input type="file" id="upload" name="upload"/>  这个name就是与Action的属性对应
 
Action类代码:

[java] 
      private
 String uploadFileName;  
  • String uploadContentType;
  • setUpload(File upload) {
  • .upload = upload;
  • }
  • setUploadFileName(String uploadFileName) {
  • .uploadFileName = uploadFileName;
  • setUploadContentType(String uploadContentType) {
  • .uploadContentType = uploadContentType;
  • }
 
 
设置3个属性。分别给set方法. 这样子,就能够获取上传的文件,文件名,文件类型。
 

注意:这个uploadFileName,uploadContentType。如果File 属性名xxx(private File xxx;) 。那这个必须是xxxFileName, xxxContentType。然后也是分别给set 方法就可以。

Struts2多文件上传

页面:

[html] 
 

10.2 文件下载

jsp页面中:

<a href="fileDownload.action?fileName=aa11.jpg">下载文件</a>

配置Struts文件:

<action name="fileDownload" class="com.cn.action.FileOperAction"    method="getDownloadFile">
                    <result name="success" type="stream">
                            <!-- 设置contentType类型,并设置响应的编码类型为UTF-8 -->
                            <param name="contentType">application/x-msdownload;charset=UTF-8</param>
                            <param name="contentDisposition">attachment;fileName="${fileName}"</param>
                            <param name="inputName">downloadFileAsInputStream</param>
                            <param name="bufferSize">2048</param>
                    </result>
 </action>

配置说明:

当然这些参数都可以在<result type="stream">中配置 例如:

<!-- 指定下载文件的文件类型,默认为text/plain -->
<param name="contentType">Application/pdf</param>
<!-- 指定由getDownloadFileAsInputStream()方法返回被下载文件的InputStream -->
<param name="inputName">downloadFileAsInputStream</param>
<!-- 下载对话框中显示下载的文件的名称 -->
<param name="contentDisposition">attachment;fileName="${fileName}"</param>
<!-- 指定下载文件的缓冲大小 -->
<param name="bufferSize">2048</param>
<!-- 是否支持缓存,默认为true -->
<param name="allowCaching">true</param>
Action中:
 public void setDownloadFileAsInputStream(InputStream downloadFileAsInputStream) {
  DownloadFileAsInputStream = downloadFileAsInputStream;
 }
 public InputStream getDownloadFileAsInputStream() {
  DownloadFileAsInputStream= ServletActionContext.getServletContext().getResourceAsStream("/files/"+fileName);
        
  return DownloadFileAsInputStream;
 }
//
 public String getDownloadFile(){
  return SUCCESS;
  
 } 学习参考:http://blog.csdn.net/leisure_life/article/details/57083523
action也可以写如下:
public class DownLoadAction {     private InputStream inputStream;
    private String fileName;//文件名随意
    public InputStream getInputStream() {
        return inputStream;
    }
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    /**
*
* @return
* @throws Exception
* 这里强调一下:首先,在你的当前工程下先得存在/images这么个文件夹
* 其次里面得有一张叫0.bmp的图片 不然到哪里去下载(我们的代码是要放到服务器上去的)
*/
    public String execute() throws Exception{
        fileName = "0.bmp";
        inputStream = ServletActionContext.getServletContext().getResourceAsStream("/images/"+fileName);
        //设置下载文件名 别整中文哈 我这用的是UUID生成随机名字
        fileName = UUID.randomUUID()+".bmp";
        /*
//如果实在是需要中文怎么办呢
fileName = "帅哥.jpg";
//先用当前编码将其打散
byte[] bytes = fileName.getBytes("utf-8");
//然后用服务端的编码组装起来
fileName = new String(bytes,"ISO-8859-1");
*/
        return "success";
    }
}

Struts2的上传与下载的更多相关文章

  1. Struts2文件上传和下载(原理)

    转自:http://zhou568xiao.iteye.com/blog/220732 1.    文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)     ...

  2. 十六、Struts2文件上传与下载

    文件上传与下载 1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post& ...

  3. 【SSH2(实用文章)】--Struts2文件上传和下载的例子

    回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...

  4. 学习Struts--Chap07:Struts2文件上传和下载

    1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...

  5. struts2 文件上传和下载,以及部分源代码解析

    struts2 文件上传 和部分源代码解析,以及一般上传原理 (1) 单文件上传 一.简单介绍 Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form ...

  6. (八)Struts2 文件上传和下载

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...

  7. struts2学习(13)struts2文件上传和下载(1)

    一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte:   例子实现 ...

  8. Struts2文件上传与下载

    一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样. ...

  9. struts2文件上传和下载

    1. struts系统中的拦截器介绍 过滤器:javaweb中的服务器组件,主要针对的请求和响应进行拦截. 拦截器:主要针对方法的调用,进行拦截器,当使用代理对象调用某个方法时候 对方法的调用进行拦截 ...

  10. 关于struts2的上传和下载

    1. 1文件上传技术: JSPSmartUpload:应用在Model1年代.(嵌入到JSP) FileUpload:应用在Model2年代. Servlet3.o:完成文件上传. Struts2框架 ...

随机推荐

  1. NOIP模拟赛 魔方

    [题目描述] ccy(ndsf)觉得手动复原魔方太慢了,所以他要借助计算机. ccy(ndsf)家的魔方都是3*3*3的三阶魔方,大家应该都见过. (3的“顺时针”改为“逆时针”,即3 4以图为准.) ...

  2. MHA

    MHA 1. MHA简介 1.1 MHA工作原理总结为如下 1.2 MHA工具包介绍 2. 部署MHA 2.1 环境介绍 2.2 一主两从复制搭建 2.3 配置互信 2.4 下载MHA 2.5 安装M ...

  3. python多进程并发进程池Pool

    简介: python中的多进程主要使用到 multiprocessing 这个库.低版本python这个库在使用 multiprocessing.Manager().Queue时会出问题,建议大家升级 ...

  4. IDEA常用快捷键(不全)

    这里使用的是默认的idea快捷键,如果修改了keymap为其他,那么不适用. 1.格式化代码:Ctrl+Alt+L(可能与QQ的冲突,建议QQ只保留方便的截图,皮) 2.在当前行最后添加分号,或自动补 ...

  5. PAT Basic 1073

    1073 多选题常见计分法 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数:如果考生选择了任何一 ...

  6. Python之多线程与多进程(一)

    多线程 多线程是程序在同样的上下文中同时运行多条线程的能力.这些线程共享同一个进程的资源,可以在并发模式(单核处理器)或并行模式(多核处理器)下执行多个任务 多线程有以下几个优点: 持续响应:在单线程 ...

  7. 一个程序员一月的开销统计分析、(附上PC端和移动端android源码)

    图片1(类别): 图片中的数据是我一月的花费统计分析. 这是该网站的地址:http://www.10086bank.com/(需要登录)  没有帐号马上注册一个吧.进入系统后点击“记一笔”  添加数据 ...

  8. PTA 11-散列4 Hard Version (30分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/680 5-18 Hashing - Hard Version   (30分) Given ...

  9. 九度oj 题目1494:Dota

    题目描述: 大家都知道在dota游戏中,装备是对于英雄来说十分重要的要素. 英雄们不仅可以购买单个的装备,甚至某些特定的装备组合能够合成更强的装备. 为了简化问题,我们将每个装备对于英雄的功能抽象为一 ...

  10. iOS学习笔记35-社交分享

    一.社交分享 现在很多应用都内置“社交分享”功能,可以将看到的新闻.博客.广告等内容分享到微博.微信.QQ.人人网等,其实从iOS6.0开始苹果官方就内置了Social.framework专门来实现社 ...