Struts2 本身是没有文件上传的功能,sturts2文件上传也是依赖第三方库来实现的,默认也是使用 commoms-fileupload。
可以在 default.properties 文件看出来:
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data # struts.multipart.parser=cos # struts.multipart.parser=pell struts.multipart.parser=jakarta # uses javax.servlet.context.tempdir by default struts.multipart.saveDir= struts.multipart.maxSize=2097152
commoms-fileupload 是 jakarta 下的一个开源项目.
struts.multipart.saveDir =
用来配制临时文件的目录。默认没有配制,使用servlet容器的临时文件目录
struts.multipart.maxSize=
配制上传文件的最大值,这个最大值不是说单一一个文件的最大值而是所有的文件最大值(多文件上传)
jsp页面 form 表单:
<s:form action="FileUpload" method="post" enctype="multipart/form-data"> <s:file name="upload" lable="选择文件"></s:file> <s:submit value="提交"></s:submit> </s:form>
Action 类:
public class FileUploadAction extends ActionSupport{ // 这是一个包含上传文件的内容的文件 // 这是一个临时的文件 当你在使用 file.getName() 的时候返回的时临时文件的名字而不是上传文件的名字 private File upload; // 上传文件的类型 private String uploadContentType; // 实际上传文件的名字 private String uploadFileName; @Override public String execute() throws Exception { InputStream in = new FileInputStream(getUpload()); String path = ServletActionContext.getServletContext().getRealPath("file"); File file = new File(path, getUploadFileName()); OutputStream out = new BufferedOutputStream( new FileOutputStream(file)); byte[] buffer = new byte[500]; int length; while ((length = in.read(buffer, 0, buffer.length)) != -1){ out.write(buffer, 0, length); } in.close(); out.close(); return SUCCESS; } public File getUpload() { return upload; } public void setUpload(File upload) { this.upload = upload; } public String getUploadContentType() { return uploadContentType; } public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType; } public String getUploadFileName() { return uploadFileName; } public void setUploadFileName(String uplpadFileName) { this.uploadFileName = uplpadFileName; } }
这里要注意的是 Action 中的 set 方法。
必须是 form 表单中 file 域 name 属性值(首字母要大写) 加 ContentType
像这里:
<s:file name="upload" lable="选择文件"></s:file>
所以 必须是 setUploadContentType (String uploadContentType), 跟 setUploadFileName(String uploadFileName) 才能正确的赋上值。
struts.xml 中 aciton 的配制:
<action name="FileUpload" class="com.test.action.FileUploadAction"> <result name="success">/success.jsp</result> </action>
多文件上传:
多文件上传时,可以在form表单中给个 file 域 设置不同的 name 属性值 然后再像单个文件上传一样处理。
也可以给多个file域设置同样的 name属性。然后在 Action 中得 File 的数组或者List再进处理
public class FileUploadAction extends ActionSupport{ private File[] upload; private String[] uploadContentType; private String[] uploadFileName; // 或者 // private List<File> upload; // Private List<String> uploadContentType; // private List<String> uploadFileName; @Override public String execute() throws Exception { // 处理 。。 。。。 } public void setUpload(File[] upload) { this.upload = upload; } public void setUploadContentType(String[] uploadContentType) { this.uploadContentType = uploadContentType; } public void setUploadFileName(String[] uplpadFileName) { this.uploadFileName = uplpadFileName; } }
实现一些其他的配制:
struts.properties 文件中设置临时文件目录,最大文件上传大小
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152
或者在struts.xml中
使用 <constant name="struts.multipart.maxSize" value="1000000" />
maxSize 是对上传文件总的大小进行的限制,如果要对单个的上传文件进行限制可以配制拦截器,对文件类型,文件的扩展名也可以进行限制
<action name="FileUpload" class="com.test.action.FileUploadAction"> <result name="success">/success.index.jsp</result> <interceptor-ref name="fileUpload"> <param name="maximnmSize">50000000</param> <param name="allowedType">image/jpeg,image/gif</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action>