在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传
步骤:
1. 在 Jsp 页面的文件上传表单里使用 file 标签. 如果需要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的
2. 在 Action 中新添加 3 个和文件上传相关的属性. 这 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
单文件上传代码如下:
第一步:在WEB-INF/lib下加入commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。这个两个文件已经在Struts2搭建jar中已经加入
第二步:把form表的enctype设置为:“multipart/form-data“,如下:
<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 HelloWorldAction{
private File uploadImage;//得到上传的文件
private String uploadImageContentType;//得到文件的类型
private String uploadImageFileName;//得到文件的名称
//这里略省了属性的getter/setter方法
public String saveFile() throws Exception{
String realpath = ServletActionContext.getServletContext().getRealPath("/images");
File file = new File(realpath);
if(!file.exists()) file.mkdirs();
FileUtils.copyFile(uploadImage, new File(file, uploadImageFileName));
return "success";
}
}
第四步:在struts.xml文件中增加如下配置
<package name="upload" namespace="/upload" extends="struts-default" >
<!-- 单文件上传 -->
<action name="uploadAction_*" class="cn.upload.UploadAction" method="{1}">
<result name="success">/upload/success.jsp</result>
<!-- 定义上传出错要转向的页面 -->
<result name="input">/upload/error.jsp</result>
</action>
<package>
设置上传文件的总开关
在struts.xml文件加载该资源文件
<!-- 设置comonFileupload上传组件允许的文件大小 才能测试出上传文件过大出现的错误信息
默认值是2M-->
<constant name="struts.multipart.maxSize" value="86170804"/>
如何实现单文件的上传:
* 定义jsp页面
<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 extends ActionSupport {
/* 上传的文件先保存到临时目录,保存为临时文件
* E:\\apache-tomcat-6.0.18\\work\\Catalina\localhost\\itcast1021struts2
* \\upload__2ad2288_13329912deb__8000_00000000.tmp
* 当处理完临时文件后,再删除该临时文件
* Removing file uploadImage E:\\apache-tomcat-6.0.18\\work\\Catalina\localhost\\struts2
* \\upload__2ad2288_13329912deb__8000_00000000.tmp
*/
private File uploadImage;
//上传文件的类型,格式:Form表单中文件域的name属性的值+ContentType
private String uploadImageContentType;
//上传文件的真实名称,格式:Form表单中文件域的name属性的值+FileName
private String uploadImageFileName;
public String saveFile(){
System.out.println("uploadImageContentType "+uploadImageContentType);
System.out.println("uploadImageFileName "+uploadImageFileName);
System.out.println("xxxxxxxxxxxx");
//保存临时文件到指定的目录
try {
ServletContext sc=ServletActionContext.getServletContext();
String realpath=sc.getRealPath("/pic");
File newFile=new File(realpath,uploadImageFileName);
FileUtils.copyFile(uploadImage, newFile);
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
}
* 创建struts_upload.xml文件,增加如下配置
<struts>
<package name="upload" namespace="/upload" extends="struts-default">
<action name="uploadAction_*" class="cn.upload.UploadAction" method="{1}">
<result name="success">/upload/success.jsp</result>
<!-- 文件上传失败时,要转向input所指向的路径 -->
<result name="input">/upload/error.jsp</result>
</action>
</package>
</struts>
* 测试
* 设置上传文件的总开关
* 在struts_upload.xml文件,增加如下配置
<!--设置上传文件的总开关,默认值是2M,全局开关,能控制项目中的所有的上传功能,小区物业的总开关-->
<constant name="struts.multipart.maxSize" value="200097152"></constant>
* 测试
* 设置只对包有效的上传文件的参数,
* 配置如下,放置在package包中
<interceptors>
<!-- 声明新的拦截器栈 -->
<interceptor-stack name="newFileUploadStack">
<!-- 修改默认栈中的上传拦截器的参数 -->
<interceptor-ref name="defaultStack">
<!--设置上传文件的大小,只对当前的action有效,小区户主家里的开关-->
<param name="fileUpload.maximumSize">20097152</param>
<!-- 配置允许上传文件的类型,如果有多个类型,中间用","隔开 -->
<param name="fileUpload.allowedTypes">application/vnd.ms-powerpoint,application/octet-stream,text/plain</param>
<!-- 配置上传文件扩展名,如果有多个类型,中间用","隔开 -->
<param name="fileUpload.allowedExtensions">ppt</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 运行新的拦截器栈 -->
<default-interceptor-ref name="newFileUploadStack"/>
* 测试
* 设置只对当前的action有效
* 配置如下,放置到action中
<!-- 在action配置上传拦截器的参数,只对当前的action有效 -->
<interceptor-ref name="defaultStack">
<!--设置上传文件的大小,只对当前的action有效,小区户主家里的开关-->
<param name="fileUpload.maximumSize">20097152</param>
<!-- 配置允许上传文件的类型,如果有多个类型,中间用","隔开 -->
<param name="fileUpload.allowedTypes">application/vnd.ms-powerpoint,application/octet-stream,text/plain</param>
<!-- 配置上传文件扩展名,如果有多个类型,中间用","隔开 -->
<param name="fileUpload.allowedExtensions">ppt</param>
</interceptor-ref>
* 测试
* 在jsp页面处理异常:
* 引入<%@ taglib uri="/struts-tags" prefix="s"%>
* 使用 <s:fielderror></s:fielderror> 显示错误处理信息
* 默认情况下显示的异常是英文的,
* 该异常在struts2-core-2.1.8.1.jar\org\apache\struts2\struts-messages.properties文件中存在
* 内容如下:
struts.messages.error.uploading=Error uploading: {0}
struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}
* 含义:
{0}:<input type=“file” name=“uploadImage”>中name属性的值
{1}:上传文件的名称
{2}:上传文件保存到临时目录的名称
{3}:上传文件的类型(对struts.messages.error.file.too.large是上传文件的大小)
* 测试
* 显示信息为中文的
* 在任意目录下,创建自定义的资源文件,本例为fileupload.properties
* 在该资源文件中增加如下内容
struts.messages.error.uploading=上传错误: {0}
struts.messages.error.file.too.large=文件太大: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=内容类型不允许: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=文件扩展名不允许: {0} "{1}" "{2}" {3}
* 在struts.xml文件中加载资源文件
<!-- 加载国际化资源文件
* cn.upload.fileupload,加载上传为资源文件
-->
<constant name="struts.custom.i18n.resources"
value="cn.upload.fileupload"></constant>
* 测试