大家都知道struts2对文件上传做了很好的封装,使文件上传不再那么恐怖。这里面struts2的文件上传主要依赖的是org.apache.struts2.interceptor.FileUploadInterceptor这个拦截器
关于这个拦截器我不想做过多的研究,这里主要讨论的是该拦截器里面定义的几个关于文件上传的重要属性。
protected Long maximumSize; |
protected String allowedTypes; |
protected Set allowedTypesSet; //允许上传的文件类型Set集合详见tomcat中web.xml文件 allowedTypes与allowedTypesSet属性如有多个值之间用逗号隔开 以上的属性主要配置在struts.xml中对应文件上传Action的拦截器中 |
示列:
<!-- 文件上传Action <action name="Upload" class="UploadAction"> <result name="success">success.jsp</result> <result name="input">upload.jsp</result> <interceptor-ref name="fileUpload"> //设置允许上传单个文件的大小单位为字节 <param name="maximumSize">102400</param> //允许上传的文件类型详见tomcat中web.xml文件 <param name="allowedTypesSet">application/msword</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> </action> |
注意:要使用文件上传功能我们必须显实的在对应文件上传的Action中指定<interceptor-ref name="fileUpload">这个拦截器及在该拦截器中配置我们需要的参数,最后别忘了附加上<interceptor-refname="defaultStack"/>这个默认的拦截器,这样才能真正发挥struts2的文件上传功能。
示列代码:
Action中的示列代码
publicclass FileUploadAction extends ActionSupport private File file; private String fileContentType; private String fileFileName; private String memo; @Override public String String path=ServletActionContext.getRequest(). if(file==null) { this.addFieldError("file", "文件不能为空,请选择"); returnINPUT; }else { InputStream is=new FileInputStream(this.getFile()); OutputStream os=new FileOutputStream(newFile(path,this.getFileFileName())); byte[] int length=0; while((length=is.read(buf))>0) { os.write(buf, 0, length); } is.close(); os.close(); } returnSUCCESS; } public File returnfile; } publicvoid setFile(File this.file = } public String returnfileContentType; } public String returnfileFileName; } public String returnmemo; } publicvoid setFileContentType(String this.fileContentType = } publicvoid setFileFileName(String this.fileFileName = } publicvoid setMemo(String this.memo = } } |
jsp中的示列代码
<s:form action="Upload" enctype="multipart/form-data" method="post"> <s:file name="file"></s:file> <s:textfield name="memo"></s:textfield> <s:submit></s:submit> </s:form> |
struts.xml中的示列代码
<action name="Upload" class="UploadAction"> <result name="success">/success.jsp</result> <result name="input">/upload.jsp</result> <interceptor-ref name="fileUpload"> <param name="maximumSize">102400</param> <param name="allowedTypes">application/msword</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> </action> |
注意:
a) 设置文件上传属性在Action中对应的类型的java.io.File;
b) 设置文件上传表单的enctype="multipart/form-data"
method="post"
private File file; private String fileContentType; private String fileFileName; |
c) 红色标注的与文件上传表单中文件上传属性的name一致
d) 蓝色的为固定写法
e) 对应Action中拦截器的配置
<interceptor-ref name="fileUpload">
<param name="maximumSize">102400</param>
<param name="allowedTypes">application/msword</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
Struts2多文件上传示例代码:
jsp上传页面代码:
<%@ page language="java" contentType="text/html; pageEncoding="gbk"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD <html> <head> <meta http-equiv="Content-Type" content="text/html; <title>Insert </head> <script type="text/javascript"> function clickme() { var divs=document.getElementById('mydiv'); var br=document.createElement('br'); var input=document.createElement('input'); input.type="file"; input.name="file" var button=document.createElement('input'); button.type="button"; button.value="remove"; divs.appendChild(br); divs.appendChild(input); divs.appendChild(button); button.onclick=function() { divs.removeChild(br); divs.removeChild(input); divs.removeChild(button); } } </script> <body> <h1>Struts2</h1> <s:fielderror name="file"/> <s:form action="Upload" enctype="multipart/form-data" method="post"> <s:file name="file" theme="simple"></s:file> <input type="button" value="Add <div id="mydiv"> </div> <s:textfield name="memo"></s:textfield> <s:submit></s:submit> </s:form> </body> </html> |
Actio中代码:用户自己写代码来判断文件类型及文件大小
package com.struts2.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class FileUploadAction extends ActionSupport { private List<File> file; private List<String> fileContentType; private List<String> fileFileName; private String memo; @Override public String execute() throws Exception { String path=ServletActionContext.getRequest().getRealPath("/upload"); if(file==null) { this.addFieldError("file", "文件不能为空,请选择"); return INPUT; }else { InputStream is = null; OutputStream os = null; File f=null; long fileSize=0; String ext=""; for (int i = 0; i < file.size(); i++) { ext=fileFileName.get(i).substring(fileFileName.get(i).lastIndexOf(".")+1); f=this.getFile().get(i); fileSize=f.length(); System.out.println("fileSize:"+fileSize); System.out.println("ext:"+ext); if("exe".equals(ext)||"jar".equals(ext)||"bat".equals(ext)||"msi".equals(ext)) { this.addFieldError("file", "the file is not allowed"); return INPUT; }
if(fileSize>102000) { this.addFieldError("file", "the file is too large"); return INPUT; }
is=new FileInputStream(f); os=new FileOutputStream(new File(path,this.getFileFileName().get(i))); byte[] buf=new byte[1024]; int length=0; while((length=is.read(buf))>0) { os.write(buf, 0, length); } } is.close(); os.close(); } return SUCCESS; } public List<File> getFile() { return file; } public void setFile(List<File> file) { this.file = file; } public List<String> getFileContentType() { return fileContentType; } public void setFileContentType(List<String> fileContentType) { this.fileContentType = fileContentType; } public List<String> getFileFileName() { return fileFileName; } public void setFileFileName(List<String> fileFileName) { this.fileFileName = fileFileName; } public String getMemo() { return memo; } public void setMemo(String memo) { this.memo = memo; } } |
Struts.xml中配置代码:
<!-- 文件上传Action <action name="Upload" class=" com.struts2.action.FileUploadAction"><result name="success">/success.jsp</result> <result name="input">/upload.jsp</result> <interceptor-ref name="fileUpload"> <!-- <param name="maximumSize">102400</param> <param name="allowedTypes">application/msword</param> --> </interceptor-ref> <interceptor-ref name="defaultStack"/> </action> |