一、未接触Struts时的文件上传:通过Struts提交的文件上传组件来上传文件。
前台:
1、提交方式POST
2、表单类型 multipart/form-data
3、input type=file
后台:Apache提供的FileUpload组件
核心类:
1、FileItemFactory:FileItem的工厂
2、ServletFileUpload:serlvet中文件上传的核心类
3、FileItem:封装了上传的表单文件项的信息
总之,文件上传,处理起来比较麻烦!!!
二、Struts的文件上传:
1、实现:文件上传的拦截器帮助我们完成了文件上传的功能。
<interceptor
name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
并且该拦截器同时存在于struts-defautl中的defaultStack中,所以是默认实现的。
2、实现文件上传的代码:
1)项目的目录结构:
2)jsp页面部分:
3)FileUploadAction.java
package sram.fileupload;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport{
//对应表单:<input type="file" name="file1">
private File file1;
//文件名 **FileName固定写法
private String file1FileName;
//文件类型(MIME) **ContentType固定写法
//Tomcat目录下的conf/web.xml中对类型是定义好的
private String file1ContentType;
public void setFile1(File file1) {
this.file1 = file1;
}
public void setFile1FileName(String file1FileName) {
this.file1FileName = file1FileName;
}
public void setFile1ContentType(String file1ContentType) {
this.file1ContentType = file1ContentType;
}
public String execute() throws Exception {
//拿到上传的文件,进行处理
System.out.println("FileUpload.execute()");
/**
* 把文件上传到upload目录
*/
//获取上传的目录的路径
String path = ServletActionContext.getServletContext().getRealPath("/upload");
//创建目标文件对象
File destFile = new File(path,file1FileName);
//把上传的文件,拷贝到目标文件中
FileUtils.copyFile(file1, destFile);
return SUCCESS;
}
}
3、文件上传细节处理
1)文件大小限制
Struts默认支持的文件上传最大是2M
通过常量修改:修改default.properties中的struts.multipart.maxSize=2097152
2)限制上传文件的允许的类型
需求:只允许txt/jpg后缀的文件
解决办法:拦截器注入参数从而限制文件上传类型
3)错误提示:
当文件上传出现错误的时候,struts内部会返回input视图(错误视图),所以就需要我们在struts.xml中配置input视图对应的错误页面!
4)struts.xml配置
<package name="fileupload" namespace="/" extends="struts-default">
<!-- name值不能写成fileUpload,原因:Struts内部使用该名称,为关键字 -->
<action name="fileUploadAction" class="sram.fileupload.FileUploadAction">
<!-- 限制允许上传的文件的类型 -->
<interceptor-ref name="defaultStack">
<!-- 限制允许的文件的扩展名【推荐使用】 -->
<param name="fileUpload.allowedExtensions">txt,jpg,jar</param>
<!-- 限制允许的类型【一般不与上面的同时是使用。如果同时使用,取交集!!】
<param name="fileUpload.allowedTypes">text/plain</param>
-->
</interceptor-ref>
<result name="success">/fileupload/success.jsp</result>
<!-- 配置错误视图 -->
<result name="input">/fileupload/error.jsp</result>
</action>
</package>