上传文件和下载文件的重要性就不说了,常用于上传文档,更换头像。
Struts2框架本身提供了一个文件上传的拦截器,在默认的拦截器里面。
一.文件上传前的准备
一.一 添加jar包
Struts2上传时,还需要依赖apache的两个jar包
一.二 注意点
1.Struts2上传文件时,用<s:file name=“upload”> 或者<input type=“file” name=“upload” />均可。 建议使用 s:file 的元素。
2.form表单提交时,提交方式为post提交。(避免文件过大,get方式不支持)
3.form表单提交时,enctype类型需要改变,应该变成:enctype=“multipart/form-data”
4.文件上传对应的Action进行接收文件时, 对象属性 File Xxx需要与<s:file >中的name相同,
如<s:file> name为upload,则Action中File相应的为upload.
<s:file>name为uploadImage,则Action中File为uploadeImage.
5.Action中取得的File upload.getName() 取得的并不是上传文件的真实名称,只是一个缓存的名称,没有任何的意义。
6.Action中想取得上传文件的名称和上传类型,需要定义两个String 类型,格式必须是XxxFileName,XxxContentType。其中Xxx为File的值
XxxFileName 取得文件的名称,XxxContentType 取得文件的类型
二 实现单文件上传
二.一 编写 上传文件表单 /content/single.jsp
<s:form action="File_single.action" namespace="/" method="post" enctype="multipart/form-data"> 用户名: <s:textfield name="name"/> <br/> 密码: <s:password name="password"/><br/> 上传文件:<s:file name="upload"/><br/> <s:submit value="提交"/> <s:reset value="重置"/> </s:form>
需要保证 类型为post 提交,enctype 类型为 multipart/form-data 。
注意,此时 file 元素的名称为upload。
二.二 编写FileAction 进行处理文件接收
FileAction.java
package com.yjl.web.action; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.yjl.pojo.User; /** * @author 两个蝴蝶飞 * @version 创建时间:Aug 28, 2018 8:35:56 AM * 关于文件上传和下载的Action实现 */ public class FileAction extends ActionSupport implements ModelDriven<User>{ private static final long serialVersionUID = 1L; private Logger logger=Logger.getLogger(FileAction.class); //在文件上传时,也同样可以获得其他标签的值. private User user=new User(); @Override public User getModel() { return user; } /** * 关于文件上传的具体的操作 * @param uploade 与前端表单中file标签的name值相同. * @param XxxFileName 上传文件的名称 * @param XxxContentType 上传文件的类型 */ private File upload; private String uploadFileName; private String uploadContentType; //实现它们三个的setter和getter方法 public File getUpload() { return upload; } public void setUpload(File upload) { this.upload = upload; } public String getUploadFileName() { return uploadFileName; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; } public String getUploadContentType() { return uploadContentType; } public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType; } /** *单文件上传操作 */ public String single(){ //在实际开发中,需要判断一下是否上传了文件,即upload是否为空,不为空,才进行上传的操作。 logger.info("可以取出user的值:"+user.toString()); if(upload!=null){ //1.输出上传的类型 logger.info("上传文件的名称用File取得:"+this.getUpload().getName()); logger.info("直接用属性取得名称:"+this.getUploadFileName()); logger.info("文件上传的类型:"+this.getUploadContentType()); //2.设置上传文件的放置位置,通常放在服务器下面的upload文件夹下. String path=ServletActionContext.getServletContext().getRealPath("/upload"); //3.这是一个目录,如果这个目录不存在,需要创建这个目录(包括其父目录) File srcFile=new File(path); if(!srcFile.exists()){ srcFile.mkdirs(); } //4.通常还需要对上传的文件名进行UUID的操作,使文件名不能重复。这里不做处理 String fileName=this.getUploadFileName(); //5.调用FileUtils类执行上传的操作. try { FileUtils.copyFile(upload,new File(srcFile,fileName)); logger.info("文件上传成功"); } catch (IOException e) { e.printStackTrace(); } } return SUCCESS; } }
二.三 配置struts.xml文件
<struts> <!--修改国际化编码 --> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <!--修改是否为开发者模式 --> <constant name="struts.devMode" value="true"></constant> <!--修改ui样式表 --> <constant name="struts.ui.theme" value="simple"></constant> <package name="file" extends="struts-default" namespace="/"> <action name="File_*" class="com.yjl.web.action.FileAction" method="{1}"> <result name="success">/WEB-INF/content/success.jsp</result> </action> <!-- 配置跳转页面 --> <action name="*"> <result>/WEB-INF/content/{1}.jsp</result> </action> </package> </struts>
二.四 重启服务器,验证文件上传
输入网址: http://localhost:8080/Struts_File/single,
进行上传文件, 老蝴蝶这儿上传一张照片。
查看logger输出
发现file.getName()并没有任何意义。
查看服务器upload文件夹下是否有这张图片:
存在图片,文件上传操作成功。
二. 五 设置上传时,允许的格式和大小
二.五.一 配置格式 和大小
通过文件上传拦截器,进行配置
在上传的时候,一般需要特别指定文件上传时的格式和大小。 Struts2自带的文件上传拦截器已经帮我们实现了这一点,
我们只需要进行简单的配置即可。
在struts.xml配置文件中添加拦截器 fileUpload
<package name="file" extends="struts-default" namespace="/"> <interceptors> <interceptor-stack name="defaultStack"> <!-- 引入已经定义好的文件上传拦截器,将参数传入进去,名称为fileUpload --> <interceptor-ref name="fileUpload"> <!-- 上传文件的大小 --> <param name="maximumSize">500000000</param> <!-- 标准MINE名称 --> <param name="allowedTypes">text/plain,application/vnd.ms-powerpoint</param> <!-- 后缀名 可以传递.txt和.ppt结尾的,此时图片是不行的--> <param name="allowedExtensions">.txt,.ppt</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="File_*" class="com.yjl.web.action.FileAction" method="{1}"> <result name="success">/WEB-INF/content/success.jsp</result> </action> <!-- 配置跳转页面 --> <action name="*"> <result>/WEB-INF/content/{1}.jsp</result> </action> </package>
二.五.二 验证配置
如果此刻上传图片的话:
会显示异常:
上传.txt文档的话:
是可以正常上传的。
一般设置图片时,常用的格式为:
<interceptors> <interceptor-stack name="defaultStack"> <!-- 引入已经定义好的文件上传拦截器,将参数传入进去,名称为fileUpload --> <interceptor-ref name="fileUpload"> <!-- 上传文件的大小 --> <param name="maximumSize">500000000</param> <!-- 后缀名 设置常见的图片形式--> <param name="allowedExtensions">.bmp,.jpg,.png,.gif</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors>
二.五.三 设置 struts.multipart.maxSize 常量,控制文件大小
有的时候,可能会上传视频或者其他大文件,可以在struts.xml常量中配置相应的上传文件大小。
默认的大小是2M,即使你在设置类型时,用了maximumSize,设置了一个很大的值。
那么当大小超过2M时,也是错误的。
这个时候需要设置另外一个参数。常量:struts.multipart.maxSize
<constant name="struts.multipart.maxSize" value="1000000000"/>