在电脑前坐了一天,看看这个看看那个,也没什么意思,就翻一翻以前培训时的课件,整理整理全当做复习了。

当我们用struts2进行文件上传时,首先要将from表单的enctype属性进行重新设置。那么该属性的取值就是决定表单数据的编码方式。一般有三个属性取值:

application/x-www-form-urlencoded:默认的编码方式,它只处理表单域里的value属性,采用这种编码方式的表单会将表单域的值处理成URL编码方式。这种方式按ISO-8859-1的编码方式将表单上传到服务器,但是这种方式是上传不了文件的。那么如果我们上传的含有文件域则采用下面的方式(multipart/form-data)。

multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。(进行文件上传时采用这种方式)

text/plain:这种编码方式当表单的action属性为mailto:URL的形式时比较方便,这种方式主要用于直接通过表单发送邮件的方式。(这种方式已经不再采用了)
注:
如果要实现文件的上传,则表单的method属性必须设置成:post提交方式。
如果要实现文件的上传,表单的enctype属性必须设置成:multipart/form-data。
一旦设置了表单的enctype="multipart/form-data" (即:<form action="" method="post" enctype="multipart/form-data">)属性,就无法通过HttpServletRequest对象的getParameter()方法获取请求参数值。(就是说除了文件域以外其他的普通表单域(如:文本框、单选框、复选框、文本域等)则取不到)

对于Java应用而言,比较常用的上传框架有两个:common-fileupload和cos,这两个框架都是负责解析出HttpServletRequest请求中的所有域。通过上传框架获得了文件域对应的文件内容,就可以通过IO流将文件内容写入服务器的任意位置。在项目开发中一般使用common-fileupload框架较多,当然针对不同的需求使用不同的上传框架,使用该框架一般需要使用如下两个jar文件:
commons-fileupload-1.2.1.jar    commons-io-1.3.2.jar

Struts2并未提供自己的请求解析器,因此Struts2并不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器(如:common-fileupload或cos),将HTTP请求中的表单域解析出来,但是Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。查看一下xml文件就能找到Strus2对应的文件上传拦截器,当然并不需要我们自己去配置,struts2已经为我们配完了,直接用就可以了。
根据实际情况定到底要选择哪个上传控件,到default.properties属性文件中去查看struts2支持哪些上传控件,自己配一下就可以了,但是别忘记拷Jar包。
Struts2默认使用Jakarata的Common-FileUpload框架实现文件上传,如果使用其它两个框架则只需要修改struts.multipart.parser常量,同时在Web工程中增加相应的上传框架的jar文件即可。
那么,我们做一下struts2的默认的上传方式的配置:

第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这两个文件可以从http://commons.apache.org/下载。

第二步:把form表的enctype设置为:“multipart/form-data“,如下:

Java代码  
  1. <form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">
  2. 书名:<input type="text" name="bookname"><br>
  3. 作者:<input type="text" name="author"><br>
  4. 图片:<input type="file" name=" uploadImage "><br>
  5. <input type="submit" value="提交"/>
  6. </form>

第三步:在Action类中添加以下属性,属性红色部分对应于表单中文件字段的名称:

Java代码  
  1. public class UploadAction{
  2. private File uploadImage; //文件
  3. private String uploadImageContentType;//文件的类型
  4. private String uploadImageFileName;//文件的名称
  5. private String bookname;//书名
  6. private String author;//作者
  7. private String savePath;//文件的保存位置
  8. //属性的getter/setter方法
  9. public String upload() throws Exception{
  10. //实现上传代码,I/O操作完成
  11. return "uploadSuccess";
  12. }
  13. }

注:一个表单里的文件域对应Action中三个属性,分别是文件,文件名,文件类型,命名是固定的,文件名必须表单中的文件域名称相同(uploadImage),文件名为:文件+FileName,文件类型:文件+ContentType。

第四步:将我们的上传Action配置到struts.xml中。

Java代码  
  1. <action name="upload" class="com.gqy.UploadAction">
  2. <param name="savePath">/uploadFile</param>
  3. <result>/success.jsp</result>
  4. </action>

注:
指定上传文件的在服务器上的保存目录,需要在UploadAction中为定义savePath变量并为其添加相应的setter和getter方法,便于Struts2将/uploadFile值赋给savePath属性,即要想在UploadAction中使用savePath变量必须在UploadAction定义。

手动配置文件过滤类型

Java代码  
  1. <param name="allowTypes">
  2. image/bmp,image/png,image/gif,image/jpeg
  3. </param>

手动配置文件大小限制

Java代码  
  1. <param name="maximumSize" >1048576</param>

使用Struts2的文件上传拦截器实现文件过滤

Struts2提供了一个文件上传的拦截器—fileUpload,通过配置该拦截器可以方便实现上传文件的过滤。
配置fileUpload拦截器时,可以为其指定两个参数:
 allowedTypes:指定允许上传的文件类型,多个文件类型之间以英文逗号(,)隔开。
 maximumSize:指定允许上传的文件大小,单位是字节。
提示:通过配置fileUpload拦截器,可以轻松的实现文过滤,当文件过滤失败后,系统自动转入input逻辑视图,因此必须为该Action配置名为input的逻辑视图,除此之外,还必须显示地为该Action配置defaultStack的拦截器引用。

使用Struts2的拦截器实现文件过滤配置如下:

Java代码  
  1. <action name="uploadFileAction" class="com.actions.UploadFileAction">
  2. <interceptor-ref name="defaultStack">
  3. <!-- 配置允许上传的文件类型,多个用","分隔 -->
  4. <param name="fileUpload.allowedTypes">
  5. image/bmp,image/png,image/gif,image/jpeg,image/jpg
  6. ,image/x-png, image/pjpeg
  7. </param>
  8. <!-- 配置允许上传的文件大小,单位字节,本例为:1MB -->
  9. <param name="fileUpload.maximumSize">1048576</param>
  10. </interceptor-ref>
  11. <result name="input">/jsp/oneFileFileupload.jsp</result>
  12. <result name="success">/jsp/result.jsp</result>
  13. </action>

当用户上传失败后,需要有一定的提示信息。在Struts2中,使用<s:fielderror/>标签即可将错误提示信息输出到页面中。
注:要想使用Struts2错误提示信息,则上传文件的Action类,必须继承ActionSupport,否则Struts2不会提供输出错误提示信息功能。

我们可以配置资源文件(.properties)来保存输出给用户的信息。

struts.messages.eror.file.too.large:当上传文件大小超过设定的值时,Struts2将输出该key对应的提示信息。
struts.messages.error.content.type.not.allowed:当上传文件类型不符合设定的值时,Struts2将输出该key对应的提示信息。
struts.messages.error.uploading:当上传文件时出现未知错误时,Struts2将输出该key对应的提示信息。

我们还要将资源文件配置到struts.xml文件中,接下来看看我们的资源文件,已经包含中文了,得把它进行一下转换再配置到工程中。
在struts.xml中设定资源文件:

<constant name="struts.custom.i18n.resources" value="messages"/>或
<constant name="struts.custom.i18n.resources" value="messages_zh_CN"/>

用命令native2ascii  d:\messages.properties d:\messages_zh_CN.properties将原有的资源文件转换成支持中的。
注:保持国际化,资源文件的名称后缀为: *_zh_CN+文件扩展名的形式。

对于多个文件上传的原理同上,但是需要注意的是,多个文件域的name属性名必须相同,而且在Action中应该使用File [] 或者List<File>来接收。

个人觉得用这样的方式进行多个文件上传不是很好。

Struts2进行文件下载

Struts2提供了stream结果类型,该结果类型专门用于支持文件下载的功能。当指定stream结果类型时,需要配置一个inputName参数,该参数指定了一个输入流,这个输入流是被下载文件的入口(即通过该入口才能实现文件以流的方式实现下载)。

实现文件下载的Action

Java代码  
  1. public class FileDownloadAction implements Action{
  2. //该属性值在配置文件中指定,Struts2会自动进行注入(即赋值),需要为该属性提供setter和 getter方法
  3. private String inputPath;//指定要下载的文件的完整路径(路径名+文件名)
  4. /*
  5. * 实现下载的Action类应该提供一个返回InputStream实例的方法,该方法对应在
  6. <result.../>里的inputName属性值为targetFile
  7. */
  8. public InputStream getTargetFile() throws Exception{
  9. return  ServletActionContext.getServletContext().getResourceAsStream(inputPath);
  10. }
  11. //处理用户请求的execute方法,该方法返回success字符串
  12. public String execute() throws Exception{
  13. return "success";
  14. }
  15. }

对应Action在struts.xml文件中的配置

Java代码  
  1. <action name="download" class="com.FileDownloadAction">
  2. <!--指定被下载资源的位置-->
  3. <param name="inputPath">/uploadFile/demo.txt</param>
  4. <!--配置结果类型为stream的结果-->
  5. <result name="success" type="stream">
  6. <!--指定下载文件的文件类型-->
  7. <param name="contentType"></param>
  8. <!--指定下载文件的文件位置-->
  9. <param name="inputName">targetFile</param>
  10. <!--指定下载文件的下载方式及下载时的保存文件名,filename保存时的文件名必须有扩展名,扩展名指示了下载类型的图标-->
  11. <param name="contentDisposition">
  12. attachment;filename=Struts2.txt
  13. </param>
  14. <!--指定下载文件的缓冲区大小-->
  15. <param name="bufferSize">4096</param>
  16. </result>
  17. </action>

Struts2实现的文件下载,对于本地下载是好使的,但是像迅雷这样的第三方下载软件是下不下来的。

在做文件上传和下载的时候一定要注意将中文文件名转码和编码。

①Struts2之实现文件上传与下载相关推荐

  1. struts2完美实现文件上传和下载

    ## struts2完美实现文件上传和下载 ## 第一步:在webx项目lib目录下加入struts.jar包 asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3 ...

  2. Struts2之实现文件上传与下载

    当我们用struts2进行文件上传时,首先要将from表单的enctype属性进行重新设置.那么该属性的取值就是决定表单数据的编码方式.一般有三个属性取值: application/x-www-for ...

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

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

  4. Struts2.3.5+Hibernate3+Spring3.1基于注解实现的多文件上传,下载

    Struts2.3.5+Hibernate3+Spring3.1基于注解实现的的多文件上传,下载,这里是上传文件到数据库中,上传控件可以增加和删除,有需要的朋友可以看看. 以下是源码下载地址:http ...

  5. Struts2文件上传与下载

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要写的是struts2 的文件上传与下载(中文文件名问题的解决).  使用的时候直接在地址栏中输入:http://loc ...

  6. 走进Struts2(六)— 文件上传和下载

    一.文件上传 实现文件上传的方式有很多种,比如Apache的Common-FileUpload,但是实现起来非常的繁琐,而Struts2来实现文件上传则简单的多,默认也是基于Common-FileUp ...

  7. Struts2实现文件上传与下载

    Struts包+源码下载地址:点击打开链接   ,打不开,复制后面 http://struts.apache.org/download.cgi#struts223  ,历史版本:http://arch ...

  8. Struts文件上传与下载详解_文件的下载

    在 两篇我们主要说的是文件的上传,既然有上传那就有下载,那么咱们看一下struts里面是怎么个下载法! 1.写个文件下载的表单页面: <a href="downLoad.action? ...

  9. Struts2_3_国际化处理_自定义拦截器_文件上传及下载_OGNL

    Struts2国际化处理 浏览器根据当前的语言环境自动查找对应的语言环境资源包, 使jsp显示合适的语言数据环境 Struts2实现国际化, 动作类必须继承ActionSupport 创建资源包 资源 ...

最新文章

  1. LeetCode 25K 个一组翻转链表26删除排序数组中的重复项
  2. SQL Server数据库备份的镜像
  3. 这样给数组初始化,你肯定没有见过
  4. 容易遗忘的JS知识点整理
  5. Spring boot 之搭建
  6. 32岁程序员推拿一小时差点丧命!医生说按错这个地方
  7. 集合与数组,集合与集合之间的转换
  8. 23种Python设计模式之工厂方法模式详解
  9. 共享图书管理系统数据库实现
  10. 清华大学保研计算机推荐信模板,清华保研推荐信模板
  11. Sumifs函数多条件求和的9个实例
  12. 【Unity性能优化】ASTC压缩格式(Android)
  13. Pale Moon 15.1 发布,苍月浏览器
  14. ios 应用跳转商店
  15. Java经典面试:源码解读及如何保证线程安全
  16. MATLAB符号表达式运算
  17. TiDB上百T数据拆分实践
  18. 【win11】安装WIN11启用TPM2.0的华硕主板M10H使用英特尔CPU设置PTT解决方案全记录
  19. 中小企业融资解决方案
  20. 使用select2实现多功能下拉框,select2中文api

热门文章

  1. Java进阶学习-9 细胞自动机
  2. 记一次修改sga大小之后出现的一系列报错
  3. python用turtle画月亮_python之turtle使用:画一颗美美哒的树
  4. python+tkinter一步步展示漂亮的棒棒糖和云朵
  5. Java 八大排序之冒泡排序详解
  6. opencv的各个模块的作用介绍和设置摄像头参数,imwrite设置保存压缩比
  7. 七牛云 转码_微信开发之录制语音本地化上传至七牛云并将amr转码为mp3
  8. NOI.5.44第n小的质数
  9. 思科Wi-Fi5 AP传统模式转换为ME
  10. 斯坦福大学开放AI挑战赛,旨在解决医疗问题