Struts2实现上传下载的说明

1. 文件上传的原理

Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。

 

2.表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:
1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
2) multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。
文件上传是web应用经常用到的一个知识。原理是,通过为表单元素设置enctype="multipart/form-data"属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。

 

3.拦截器实现文件过滤

Struts 2提供了一个文件上传的拦截器,通过配置该拦截器可以轻松的实现文件过滤。Struts 2中文件上传的拦截器是fielUpload,为了让该拦截器起作用,只需要在该Action中配置拦截器引用即可。

配置fielUpload拦截器,可以为其指定两个参数:

allowedTypes:该参数指定允许上传的文件类型,多个文件类型之间以英文逗号隔开

maximumSize:该参数指定允许上传的文件大小,单位是字节。但是有一点要注意Struts2默认文件上传最大为2M,即便你设置了

 

<param name="maximumSize">5242880</param>

 当上传的文件大于2M时候也会出错的。这时要设置另外一个常量并且要让他的value设置的比你限定上传最大值要大一点。

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

 

 

 

<package name="uploadAction" extends="struts-default">
        <action name="upload" class="com.app.action.UploadAction">

            <!-- 配置fileUpload的拦截器 -->

            <interceptor-ref name="fileUpload">
              <!-- 配置允许上传的文件类型 -->
              <param name="allowedTypes">image/png,image/gif,image/jpeg</param>
              <!-- 配置允许上传的文件大小 -->
              <param name="maximumSize">2000</param>
            </interceptor-ref>

            <!-- 配置系统默认的拦截器 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>

            <!-- 动态设置Action的属性值(图片上传的路径) -->
            <param name="savePath">/upload</param>
            <result name="input">/upload.jsp</result>
            <result name="success">/success.jsp</result>
        </action>
    </package>

 

4.实现下载的配置

 

 

<action name="download" class="com.action.DownloadAction" >
             <result name="success" type="stream">
             <!--指定文件下载类型     application/octet-stream默认值可以下载所有类型    -->
                 <param name="contentType">
                     application/txt;
                 </param>
             <!-- 指定下载的文件名和显示方式 ,但注意中文名的乱码问题,解决办法是:进行编码处理-->
             <!--contentDisposition是文件下载的处理方式,包括内联(inline)和附件(attachment),默认是inline, 使用附件时这样配置:attachment;filename="文件名" 。-->
             <!--由getFileName()方法获得文件名-->
                 <param name="contentDisposition">
                   attachment;filename="${fileName}"
                 </param>

             <!--由getDownloadFile()方法获得inputStream-->
                 <param name="inputName">downloadFile</param>

 <!--                指定下载文件的缓存大小-->
                 <param name="bufferSize">2048</param>
             </result>
         </action>

 

这个action特殊的地方在于result的类型是一个流(stream ),配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location 属性,只需要指定inputName 属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream。下面则列出了和下载有关的一些参数列表:

参数说明

contentType

内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XMLimage/gif代表GIF图片,image/jpeg代表JPG图片

inputName

下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream 的属性需要编写getInputStream()方法

contentDisposition

文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:attachment;filename="struts2.txt" ,表示文件下载的时候保存的名字应为struts2.txt 。如果直接写filename="struts2.txt" ,那么默认情况是代表inline ,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="struts2.txt"。在很多的时候我们一般都不是把文件名写死在xml配置当中的,我们一般会在action中定义一个变量filename,储存这个文件名。

bufferSize

下载缓冲区的大小

在这里面,contentType 属性和contentDisposition 分别对应着HTTP响应中的头Content-Type 和Content-disposition 头

5.Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:
类型为File的xxx属性:用来封装页面文件域对应的文件内容。
类型为String的xxxFileName属性:用来封装该文件域对应的文件的文件名。
类型为String的xxxContentType属性:用来封装该文件域应用的文件的文件类型。

你可能感兴趣的:(struts2)