十一、Struts2上传文件

先来一个表单

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
</head>
<body>

	<form action="${pageContext.request.contextPath }/upload" method=post enctype="multipart/form-data">
		
		姓名:<input type="text" name="name"> <br/>
		年龄:<input type="text" name="age"> <br/>
		头像:<input type="file" name="upload"> <br/>
		<input type="submit" value="提交">
	</form>
</body>
</html>

编写javaBean

package blog.csdn.net.domain;

public class User {
	private String name;
	private Integer age;
	private String image;

	//get set方法...
}

编写文件上传Action

package blog.csdn.net.web.action;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import blog.csdn.net.domain.User;
import blog.csdn.net.utils.UploadUtils;

public class UploadAction extends ActionSupport implements ModelDriven<User> {

	private static final long serialVersionUID = 1L;
	
	//模型驱动注入值
	private User user = new User();
	
	@Override
	public User getModel() {
		return user;
	}

	
	/**
	 * 通过属性驱动注入3个值
	 * 文件上传相关的3个属性 ,struts2会自动注入 
	 * 上传的文件 : 属性名与表单中file的name属性名一致 
	 * 上传的文件名:属性名前段是name属性名一致+FileName; 
	 * 上传的文件类型: 属性名前段是name属性名一致 + ContentType;
	 */
	private File upload; // 表单的name是upload
	private String uploadFileName; // 文件名
	private String uploadContentType;// 文件类型

	public void setUpload(File upload) {
		this.upload = upload;
	}

	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}

	public String upload() throws IOException {
		if (null != this.uploadFileName) {
			// 说明有文件需要上传
			String filename = UploadUtils.getUUIDName(this.uploadFileName);
			// 保存到tomcat目录下
			String uploadDidr = "E:\\apache-tomcat-7.0.52\\webapps\\upload";
			// 保存上传的文件,通过apache提供的工具类来操作
			FileUtils.copyFile(upload, new File(uploadDidr, filename));
			
			//保存文件到User中,只保存相对路径,外部访问的时候可以拼上tomcat服务器的地址
			user.setImage("/upload/"+filename);
		}
		
		//下面的操作就是调业务层的代码将user的数据进行保存,例如userService.save(user);
		//我这里没有集成hibernate,所以就直接通过控制台来查看了
		System.out.println(user);
		
		//回写结果
		HttpServletResponse response = ServletActionContext.getResponse();
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().print("提交成功!!");
		
		return NONE;
	}


}

配置struts.xml 配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

	<package name="default" namespace="/" extends="struts-default">
	
		<action name="*" class="blog.csdn.net.web.action.UploadAction" method="{1}"/>
	</package>

</struts>

UploadUtils工具类

package blog.csdn.net.utils;

import java.util.UUID;

/**
 * 文件上传的工具类
 */
public class UploadUtils {
	
	/**
	 * 传入文件的名称,返回的唯一的名称
	 * 例如:gril.jpg	返回sdjsljfsjdl.jpg
	 * @param filename
	 * @return
	 */
	public static String getUUIDName(String filename){
		// 先查找
		int index = filename.lastIndexOf(".");
		// 截取
		String lastname = filename.substring(index, filename.length());
		// 唯一 字符串  fsd-sfsdf-sfsd-sdfsd
		String uuid = UUID.randomUUID().toString().replace("-", "");
		return uuid+lastname;
	}
	
}

ok,可以测试了。

在这里插入图片描述
提交后,看到
在这里插入图片描述
控制台输出结果:
在这里插入图片描述
查看tomcat下upload目录的结果:
在这里插入图片描述
然后就可以拼接图片的路径来访问上传的内容啦,例如http://192.168.30.217:8080/upload/e359f3f4b7b94e42946c18fe73e01b1a.png
在这里插入图片描述

配置文件上传的大小和上传类型

默认情况下,Struts2单个文件上传大小限制是2M,超出后会报下面这个错误
在这里插入图片描述
对于这个没有找到定义在UploadAction下的result里的input返回结果, 我们可以配置一下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

	<package name="default" namespace="/" extends="struts-default">
	
		<action name="*" class="blog.csdn.net.web.action.UploadAction" method="{1}">
			<!-- 配置input结果错误的页面 -->
			<result name="input" type="redirect">/msg.jsp</result>
		</action>
	</package>

</struts>

指定跳去的页面是:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>异常</title>
</head>
<body>
	<h1>服务器异常</h1>
	文件上传超出最大限制
</body>
</html>

然后,再次上传一个超过2M的文件,看到的页面就是我们指定跳转的页面了.
在这里插入图片描述
除了解决input异常的错误页面,我们还可以修改Struts2的单个文件上传的大小,只需要在struts.xml中加一条常量配置

<!-- 设置上传文件的总大小,默认是2M  struts.multipart.maxSize=2097152,现在修改成最大20M -->
<constant name="struts.multipart.maxSize" value="20971520"/>

关于如何查看有那些常量可以使用,可以查看struts2核心包中的这个文件
在这里插入图片描述

另外,如果要限制文件的上传类型的话,只需要给文件上传拦截器org.apache.struts2.interceptor.FileUploadInterceptor的allowedExtensions属性添加类型约束即可.该拦截器定义在defaultStack默认的拦截器栈中,也就这个:
在这里插入图片描述
对应的class
在这里插入图片描述
这些声明都是定义在Struts2的核心jar包的struts-default.xml中
在这里插入图片描述

ok,扯了那么多,回归都操作上就是在指定的Action中加入这几行代码

<!-- 引入默认的拦截器 -->
<interceptor-ref name="defaultStack">
	<!-- 决定上传文件的类型,多个类型用,号分开 -->
	<param name="fileUpload.allowedExtensions">.jpg,.png</param>
</interceptor-ref>

完整的struts.xml文件配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<!-- 设置上传文件的总大小,默认是2M  struts.multipart.maxSize=2097152,现在修改成最大20M -->
	<constant name="struts.multipart.maxSize" value="20971520"/>
	
	<package name="default" namespace="/" extends="struts-default">
	
		<action name="*" class="blog.csdn.net.web.action.UploadAction" method="{1}">
			<!-- 配置input结果错误的页面 -->
			<result name="input" type="redirect">/msg.jsp</result>
			
			<!-- 引入默认的拦截器 -->
			<interceptor-ref name="defaultStack">
				<!-- 决定上传文件的类型,参数name=拦截器名.属性名 -->
				<param name="fileUpload.allowedExtensions">.jpg,.png</param>
			</interceptor-ref>
			
		</action>
	</package>

</struts>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值