Struts2上传下载
文件上传
如果想使用HTML表单上传文件(一个或多个),那么必须把HTML表单的enctype属性设置成multipart/form-data,且method=post, 且使用<input type="file">.
在Struts里,我么使用FileUpload拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传.
步骤:1.在jsp中使用file标签,如果上传一个文件就写一个,多个文件的话使用多个file标签,但是它们的名字相同.
2.在action中添加3个和文件上传相关的属性 且格式固定
private File uploadImage; //上传的文件 private String uploadImageContentType; //上传的文件的类型 private String uploadImageFileName; //上传文件的名称
其中 uploadImage是jsp页面file的名字 <input type="file" name="uploadImage">
如果是上传单个文件, uploadImage属性的类型就是 java.io.File, 它代表被上传的文件, 第二个和第三个属性的类型是 String, 它们分别代表上传文件的文件名和文件类型 定义方式是分别是jsp页面file组件的名称+ContentType,jsp页面file组件的名称+FileName
如果上上传多个文件, 可以使用数组或 List
一.单文件的上传
- 首先需要导包 commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar
- 把form表单的ectype属性设置成multipart/form-data method设置成post 代码如下
<form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action" name="form1" method="post" enctype="multipart/form-data" > 上传文件名称:<input type="file" name="uploadImage"> <input type="submit" value="上传"> </form>
- 在action表单中添加如下属性,且文件名字必须与表单中字段对应
public class UploadAction{
private File uploadImage;//得到上传的文件private String uploadImageContentType;//得到文件的类型
private String uploadImageFileName;//得到文件的名称
//这里略省了属性的getter/setter方法
public String saveFile() throws Exception{/**servletContext提供了标准的Servlet运行环境,其实就是一些servlet和web 容器进行通信的方法。
ServletActionContext 其实是ActionContext的子类,其功能脱胎于ActionContext,对ActionContext的方法做了一定的包装,提供了更简便直观的方法。
ActionContext来源于Struts2,ActionContext就是为了弥补strtus2 action跳出标准servlet框架而造成的和WEB环境失去联系的缺陷。 */
ServletContext sc = ServletActionContext.getServletContext();
String realpath = sc.getRealPath(“/uploadfile”); //目标路径 存储到哪里
try {
File destFile = new File(realpath, uploadImageFileName);//在目标路径下创建文件
FileUtils.copyFile(uploadImage, destFile);//将文件拷贝到目标文件中 uploadImage-->destFile
} catch (IOException e) {
e.printStackTrace();
}
return "success";}}
值得注意的是我这里的目标路径是肯定存在的,如果开发中我们要进行判断是不是存在,不存在则创建. -
设置上传文件的最大值在struts.xml文件加载该资源文件
<!-- 设置comonFileupload上传组件允许的文件大小 才能测试出上传文件过大出现的错误信息
默认值是2M-->
<constant name="struts.multipart.maxSize" value="86170804"/>
5.在struts.xml文件中增加如下配置
<package name="upload" namespace="/upload" extends="struts-default" > <!-- 单文件上传 --> <action name="uploadAction_*" class="cn.itcast.upload.UploadAction" method="{1}"> <result name="success">/upload/success.jsp</result> <!-- 定义上传出错要转向的页面 --> <result name="input">/upload/error.jsp</result> </action> <package>
File Upload 拦截器
- File Upload拦截器负责处理文件的上传操作,它是默认的defaultStack拦截器粘的一员
- File Upload有三个属性可以设置 maximumSize:上传最大长度(单位是字节),默认是2MB allowedTypes:上传文件的类型 ,用","分割 allowedExtensions:文件扩展名.","分割
-
若用户上传的文件大小大于给定的最大长度或其内容类型没有被列在 allowedTypes, allowedExtensions 参数里, 将会显示一条出错消息. 与文件上传有关的出错消息在struts-messages.properties 文件里预定义. (org.apache.struts2包下)
-
可以在文件上传 Action 相对应的资源文件中重新定义错误消息, 但需要在 struts.xml 文件中配置使用 action 的消息:
在jsp页面显示错误信息
在struts.xml文件中根据 <result name=“input”>/upload/error.jsp</result>中所指向的error.jsp页面可以使用<s:fielderror/>显示错误信息
自定义错误信息
- 创建新的资源文件 例如message_zh_CN.properties,放置在src下在该资源文件中增加如下信息
struts.messages.error.uploading=上传错误:
struts.messages.error.file.too.large=上传文件太大:
struts.messages.error.content.type.not.allowed=上传文件的类型不允许: struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: -
在struts.xml文件加载该资源文件
<constant name="struts.custom.i18n.resources" value="message"></constant>
message意思为以message开头的属性配置文件,中文的文件名为:message_zh_CN.properties
多文件上传
多文件上传和单文件上传的区别主要在于action的处理
多文件上传的aciton
public class uploadAction{ //多文件所以用的是数组的形式
private File[] uploadImages;//得到上传的文件 private String[] uploadImagesContentType;//得到文件的类型 private String[] uploadImagesFileName;//得到文件的名称 //这里略省了属性的getter/setter方法 public String saveFiles() throws Exception{ ServletContext sc = ServletActionContext.getServletContext(); String realpath = sc.getRealPath("/uploadfile"); try { if(uploadImages!=null&&uploadImages.length>0){ for(int i=0;i<uploadImages.length;i++){ File destFile = new File(realpath,uploadImageFileNames[i]); FileUtils.copyFile(uploadImages[i], destFile); } } } catch (IOException e) { e.printStackTrace();}return "success";}}
文件的下载
-
struts2提供了stream结果类型,该结果类型就是专门用于支持文件下载功能的
-
指定stream结果类型 需要指定一个 inputName参数,该参数指定一个输入流,提供被下载文件的入口
DownLoadAction.java
package com.action; import java.io.InputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction extends ActionSupport{ private static final long serialVersionUID = 1L; //文件路径 private String path; //path属性的getter方法 public String getPath(){ return path; } //path属性的setter方法 public void setPath(String path){ this.path = path; } //返回inputstream,文件下载关键方法 public java.io.InputStream getDownloadFile() throws Exception{ InputStream in = ServletActionContext.getServletContext().getResourceAsStream(getPath()); return in; } public String execute() throws Exception{ return SUCCESS; } }
Struts.xml配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 配置 Struts 2 应用中的常量 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <!-- 配置上传文件的最大容量,struts2默认为2M。单位是1B, 1KB=1024B,1M=1024KB,1M=1024*1024B--> <constant name="struts.multipart.maxSize" value="1048576" /> <!-- 配置本应用中的包,继承 struts-default 包 --> <package name="FileDownload" namespace="/" extends="struts-default"> <action name="download" class="com.action.DownloadAction"> <!-- 设置文件路径的参数,传到action类文件中去 --> <!-- <param name="path">\download\a.jpg</param> --> <!-- 下载文件类型定义,即定义为“stream” --> <result name="success" type="stream"> <!-- image/jpeg代表JPG图片 --> <param name="contentType">image/jpeg</param> <!-- 下载文件处理方法 --> <param name="contentDisposition"> <!-- attachment表示附件方式,即下载时打开保存对话窗,filename表示下载时显示的保存时的文件名 --> <!-- 如果不写attachment;或者是写的是inline; 则表示内联,即会在浏览器中尝试打开下载的文件,而不是下载--> attachment;filename="a.jpg" </param> <!-- 下载文件输出流定义 --> <!-- 这里的inputName元素所对应的value值downloadFile,在action中一定要有对应的getDownloadFile()方法 --> <param name="inputName">downloadFile</param> <!-- 下载缓冲区的大小 --> <param name="bufferSize">1024</param> </result> </action> </package> </struts>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>首页</title> </head> <body> <center> 欢迎来到首页,点下面链接去下载一个文件<br /> <a href="download.action?path=<%="./download/a.jpg" %>">下载</a> </center> </body> </html>
文件路径
项目中要提前建立好download目录,和里面要存在有a.jpg文件,否则,下载会失败。
功能入口
项目发布到服务器后,用浏览器访问项目中的index.jsp ,点击下载链接,就可以弹出“下载”对话框。
到此Strtus2文件的上传和下载我们基本了解了.