struts2-文件上传1
文件上传概述
Struts 对文件上传的支持
在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传.
步骤:
•1. 在 Jsp 页面的文件上传表单里使用 file 标签. 如果需要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的
•2. 在 Action 中新添加 3 个和文件上传相关的属性. 这 3 个属性的名字必须是以下格式:
1 private File uploadImage; //上传的文件 2 private String uploadImageContentType; //上传的文件的类型 3 private String uploadImageFileName; //上传文件的名称
上传文件:<input type="file" name="uploadImage">•如果是上传单个文件, uploadImage属性的类型就是 java.io.File, 它代表被上传的文件,
第二个uploadImageContentType和第三个属性uploadImageFileName的类型是 String, 它们分别代表文件类型和上传文件的文件名
定义方式是分别是jsp页面file组件的名称+ContentType,jsp页面file组件的名称+FileName
单文件上传代码如下
定义上传出错要转向的页面
1 第四步:在struts.xml文件中增加如下配置 2 <package name="upload" namespace="/upload" extends="struts-default" > 3 <!-- 单文件上传 --> 4 <action name="uploadAction_*" class="cn.itcast.upload.UploadAction" method="{1}"> 5 <result name="success">/upload/success.jsp</result> 6 7 <!-- 定义上传出错要转向的页面 --> 8 <result name="input">/upload/error.jsp</result> 9 </action> 10 <package>
设置上传文件的总开关
单文件上传总结:
1 * 单文件上传: 2 * 在动作类action中声明相关属性: 3 * 在动作类action中,要声明与页面中表单name属性同名的属性,同名的属性的类型时File类型; 4 * 在动作类action中,要声明[同名的属性]ContentType,类型时String类型; 5 * 在动作类action中,要声明[同名的属性]FileName,类型时String类型 6 * 给所有属性提供get和set方法 7 * 在业务方法中,处理文件上传: 8 * 获取要上传文件的路径,保存的位置 9 * 在目标文件夹内,创建一个与上传文件同名的文件 10 * 通过FileUtils工具类提供copyFile()方法,将临时文件内容拷贝到目标文件夹下的那个同名的文件 11 * 设置上传文件的总大小 12 * 在struts.xml文件中,<constant name="struts.multipart.maxSize" value="2097152000"></constant> 13 * 设置上传文件的大小、类型和扩展名: 14 * 在自定义的配置文件中,在action标签下: 15 <!-- 配置拦截器的参数,这里是文件上传拦截器 --> 16 <interceptor-ref name="defaultStack"> 17 <!-- 18 配置文件上传拦截器的参数 19 * 与定义参数的顺序无关 20 * 允许的类型(allowedTypes)和允许的扩展名(allowedExtensions)必须保持一致 21 --> 22 <!-- 23 * 配置上传文件的大小 24 * struts.xml文件中配置的是上传文件的总大小 25 * 这里配置的是上传文件的单个大小 26 --> 27 <param name="fileUpload.maximumSize">20971520</param> 28 <!-- 配置上传文件允许的类型,如果配置多个值的话,用","隔开 --> 29 <param name="fileUpload.allowedTypes">text/plain,application/msword</param> 30 <!-- 配置上传文件的扩展名,如果配置多个值的话,用","隔开 --> 31 <param name="fileUpload.allowedExtensions">.txt</param> 32 </interceptor-ref> 33 * 自定义上传文件的错误提示信息: 34 * 在动作类action同目录下,创建一个名为fileuploadmessage.properties资源文件(名为自定义) 35 * 改资源文件配置如下: 36 struts.messages.error.uploading=Error uploading: {0} 37 struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3} 38 struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3} 39 struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}
样例代码:
1、jsp
upload.jsp
1 <%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> 2 <%@ taglib uri="/struts-tags" prefix="s"%> 3 <html> 4 <head> 5 <title>My JSP 'index.jsp' starting page</title> 6 </head> 7 <body> 8 <form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action" 9 name="form1" method="post" enctype="multipart/form-data" > 10 11 上传文件名称:<input type="file" name="uploadImage"> 12 <input type="submit" value="上传"> 13 </form> 14 </body> 15 </html>
success.jsp
1 <%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> 2 <%@ taglib uri="/struts-tags" prefix="s"%> 3 <html> 4 <head> 5 <title>My JSP 'index.jsp' starting page</title> 6 </head> 7 <body> 8 上传成功!!!!<br> 9 </body> 10 </html>
error.jsp
1 <%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%> 2 <%@ taglib uri="/struts-tags" prefix="s"%> 3 <html> 4 <head> 5 <title>My JSP 'index.jsp' starting page</title> 6 </head> 7 <body> 8 失败!!!!<br> 9 <s:fielderror/> 10 </body> 11 </html>
2、java
UploadAction.java
1 import java.io.File; 2 import java.io.IOException; 3 4 import javax.servlet.ServletContext; 5 import javax.servlet.http.HttpServletRequest; 6 7 import org.apache.commons.io.FileUtils; 8 import org.apache.struts2.ServletActionContext; 9 10 import com.opensymphony.xwork2.ActionSupport; 11 12 @SuppressWarnings("serial") 13 public class UploadAction extends ActionSupport { 14 15 /* 16 * 上传文件的存储的临时文件: 17 * E:\\TOOLS\\apache-tomcat-6.0.35\\work\\Catalina\\localhost\\itcast1105_struts\\upload__5fee1dc7_13ad3d1835b__8000_00000000.tmp 18 */ 19 private File uploadImage; 20 21 //上传文件的类型:text/plain 22 private String uploadImageContentType;//application/zip 23 24 //上传文件的真是名称 2013年上期大学生信用档案建设.zip 25 private String uploadImageFileName; 26 27 public File getUploadImage() { 28 return uploadImage; 29 } 30 31 public void setUploadImage(File uploadImage) { 32 this.uploadImage = uploadImage; 33 } 34 35 public String getUploadImageContentType() { 36 return uploadImageContentType; 37 } 38 39 public void setUploadImageContentType(String uploadImageContentType) { 40 this.uploadImageContentType = uploadImageContentType; 41 } 42 43 public String getUploadImageFileName() { 44 return uploadImageFileName; 45 } 46 47 public void setUploadImageFileName(String uploadImageFileName) { 48 this.uploadImageFileName = uploadImageFileName; 49 } 50 51 public String saveFile(){ 52 System.out.println("UploadAction *********** saveFile()"); 53 54 ServletContext sc = ServletActionContext.getServletContext(); 55 56 String path = sc.getRealPath("/fileupload");//request下的该方法过时了 57 58 File file = new File(path, uploadImageFileName); 59 60 try { 61 62 FileUtils.copyFile(uploadImage, file); 63 64 } catch (IOException e) { 65 e.printStackTrace(); 66 } 67 68 uploadImage.delete();//高版本支持自动清空,低版本不支持 69 70 return "success"; 71 } 72 73 }
3、xml
struts_upload.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <!-- /upload/uploadAction_saveFile.action --> 7 <package name="upload" namespace="/upload" extends="struts-default"> 8 <action name="uploadAction_saveFile" class="cn.zengfansheng.struts.upload.UploadAction" method="upload"> 9 <result name="success"> 10 <param name="location">/upload/success.jsp</param> 11 </result> 12 <result name="input">/upload/error.jsp</result> 13 </action> 14 </package> 15 </struts>
struts.xml
1 <!-- 配置文件上传的总大小 --> 2 <constant name="struts.multipart.maxSize" value="2097152000"></constant> 3 <include file="cn/zengfansheng/struts/upload/struts_upload.xml"></include>
<constant name="struts.custom.i18n.resources" value="cn.zengfansheng.struts.upload.fileuploadmessage"></constant>
<!-- 省略后缀名,如果配置了多个struts.custom.i18n.resources,后面的会覆盖前面的,出现不起效果 -->
4、properties
fileuploadmessage.properties
1 struts.messages.error.uploading=\u4E0A\u4F20\u51FA\u9519\: {0} 2 struts.messages.error.file.too.large=\u6587\u4EF6\u8FC7\u5927\: {0} "{1}" "{2}" {3} 3 struts.messages.error.content.type.not.allowed=\u7C7B\u578B\u4E0D\u5141\u8BB8\: {0} "{1}" "{2}" {3} 4 struts.messages.error.file.extension.not.allowed=\u6269\u5C55\u540D\u4E0D\u5141\u8BB8\: {0} "{1}" "{2}" {3}