文件上传
基本原理
上传文件是由FileUploadInterceptor实现的,基本原理是这样的,FileUploadInterceptor会从上传的数据中解析出 上传的文件名称,文件类型和文件内容,调用Action相应的方法进行设置。
假定上传表单中File控件的名称是upload,则Action必须实现如下三个设值方法:
setUploadFile……保存上传的文件内容
setUploadFileName……保存上传的文件名称
setUploadContentType……保存上传的文件类型
拦截器支持针对上传表单同一名称的文件控件有多个的情况,也就是同时上传多个文件,此时要求上述方法的参数是一个列表或者数组,下面描述同时上传多个文件的实现步骤:
构建上传表单
下面的示例代码中,名称为upload的File控件有多个,表示要同时上传多个文件。
- <s:form></s:form>"upload" action="customer/upload.action" method="POST"
- enctype="multipart/form-data">
- <s:file></s:file>"File (1)" name="upload" />
- <s:file></s:file>"File (2)" name="upload" />
- <s:file></s:file>"FIle (3)" name="upload" />
- <s:submit> </s:submit>
实现Action
这里重点列举必须实现的三个设值方法,我们可以注意到,方法名称是单数形式,但是参数是一个列表。
- public void setUploadContentType( List<string> uploadContentTypes) </string>
- {
- this.uploadContentType = uploadContentTypes;
- }
- public void setUploadFileName( List<string> uploadFileNames) </string>
- {
- this.uploadFileName = uploadFileNames;
- }
- public void setUpload( List<file> uploads) </file>
- {
- this.upload = uploads;
- }
配置拦截器
具体的配置不再赘述,需要提一下的是此拦截器支持allowTypes和maximumSize属性,支持限制文件类型及文件大小。
另外在捕获错误时,会设置几个字段错误,字段错误的消息可以在资源文件中配置,支持的三种错误类型的键值如下:
struts.messages.error.uploading……当文件不能被上传时的错误信息。
struts.messages.error.file.too.large……文件大小超限时的错误信息。
struts.messages.error.content.type.not.allowed……文件类型不允许时的错误信息。
全局配置
可以在struts.properties文件中设置上传文件保存的临时目录,最大大小等。
下载
下载是通过StreamResult类来实现,这是一个自定义结果类型,主要作用是直接向HttpServletResponse对象发送原始数据。 StreamResult假定Action会提供一个输入流的访问方法,并将这个输入流输出到响应对象中。
SteamResult还提供如下配置属性。
contentType……发送数据的MIME类型,比如text/plain
contentLength……内容长度,单位为字节,浏览器会基于此值显示进度条
contentDispostion……设置响应头Content-disposition的值,缺省为inline
bufferSize……从输入流中读取到输出流的缓存大小
inputName……action中提供输入流的属性名称,缺省为inputStream
下面是一个StreamResult的配置示例:
- <action name="download2" class="org.apache.struts2.showcase.filedownload.FileDownloadAction">
- <param name="inputPath">\images\struts-gif.zip</param>
- <result name="success" type="stream">
- <param name="contentType">application/zip</param>
- <param name="inputName">inputStream</param>
- <param name="contentDisposition">filename="struts-gif.zip"</param>
- <param name="bufferSize">4096</param>
- </result>
- </action>
注意:Result对象中可以通过OGNL语法访问值堆栈,这意味着可以通过Action或其他方式传递值来设置Result配置参数,比如上述配置中contentDisposition通常是动态的,这可以通过action传递。