Struts2的文件上传

简介: 以前感觉文件上传不怎么会,都是从网上粘贴的代码就行了,这两天学习了下Struts2的文件上传,感觉很好用啊!记录以便己用。 在JavaEE中的文件上传需要注意一点的是就是:表单的enctype属性了。

以前感觉文件上传不怎么会,都是从网上粘贴的代码就行了,这两天学习了下Struts2的文件上传,感觉很好用啊!记录以便己用。

在JavaEE中的文件上传需要注意一点的是就是:表单的enctype属性了。

enctype主要有三种属性:

1、application/x-www-form-urlencoded:这个是默认的编码方式,它只处理表单域中的value值,采用这种方式会把表单域中的值处理成URL的形式。

2、multipart/form-data:这种方式会以二进制的方式来处理表单中的数据,它也会把文件域指定的文件封装到请求参数中去。

3、text/plain:当表单action属性为mailto:URL的形式的时候使用它比较方便,它主要是用于直接通过表单发送邮件的情况。

使用Struts2上传文件主要依赖的组件是common-fileupload.jar和common-io-*.jar,而且在JSP中的文件类型的Input中,在Struts2中相对应着三个属性值分别为:文件类型:***,String类型:***FileName,String类型:***ContentType

JSP中表单如下:

	<s:form action="addPic" method="post" enctype="multipart/form-data">
		<s:textfield name="picName" label="图片名" />
		<s:file name="pic" label="请选择文件" />
		<s:submit value="提交" />
	</s:form>
提交给Struts2的Action

public class AddPicAction extends ActionSupport {

	private String picName;
	//每个上传的文件域需要封装三个字段域
	private File pic;				//对应上传文件本身
	private String picFileName;		//对应上传文件的原始名字
	private String picContentType;	//对应上传文件的类型
	
	@Override
	public String execute() throws Exception{
		//这里主要是通过IO流实现文件的读写
		String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");
		String newFileName = UUID.randomUUID().toString()+
				picFileName.substring(picFileName.lastIndexOf("."));
		//打印一下文件保存的路径
		System.out.println(uploadPath+"/"+newFileName);
		//IO输入流通过FileInputStream将文件从盘中读进来
		FileInputStream is = new FileInputStream(pic);
                //通过FileOutputStream将文件写到我们要保存的路径下
                FileOutputStream os = new FileOutputStream(uploadPath +"/"+newFileName);
		
		byte[] buff = new byte[1024];
		int len = 0;
		while((len = is.read(buff))>0){
			os.write(buff, 0, len);
		}
		is.close();
		os.close();
		
		return SUCCESS;
	}
        //这里字段的setter和getter方法就省略啦!
 }

之后通过struts2的配置文件跳转到相应的页面就行了,然后还需要对上传文件进行过滤,肯定不能让什么文件都能上传,那样相当不安全吧!

Struts2给我们提供了一个fileUpload拦截器,使用相当方便,我只需要在Strtus2的配置文件中引入相应的拦截器就行了:如下:

<action name="addPic" class="struts2.AddPicAction">
       		<interceptor-ref name="fileUpload">
       			<!-- 设置允许上传的文件类型 -->
       			<param name="allowedTypes">image/jpeg,image/png,
       				image/gif,image/pjpeg</param>
       			<!-- 设置允许上传文件的大小为:20K -->
       			<param name="maximumSize">20000</param>
       		</interceptor-ref>
       		<!-- 还需要系统默认的拦截器 -->
       		<interceptor-ref name="defaultStack" />
       		<result name="input">upload.jsp</result>
       		<result>success.jsp</result>
       </action>

这个地方注意的一点是引入了fileUpload拦截器之后,系统默认的拦截器就不起作用了,这时还需要我们手动的把defaultStack引入进去。

如果上传文件不符合我们要求的就会报错,系统会默认提示错误,但是那都是英文的,对于我们使用汉语的来说不是一件好事啊!所以我们需要把英文转换成汉语,我需要建一个国际化文件比如:message_zh_CN.properties我们可以把报错的信息写进去:

struts.messages.error.content.type.not.allowed是提示文件不是允许的类型

struts.messages.error.file.too.large是提示文件太大

struts.messages.error.uploading是提示未知错误

这样拦截器就完成了!



目录
相关文章
|
机器学习/深度学习 人工智能 搜索推荐
AIGC工具——文心一格
【1月更文挑战第12天】AIGC工具——文心一格
1211 3
AIGC工具——文心一格
深入探究Camunda监听器
执行监听器与任务监听器
2122 1
深入探究Camunda监听器
|
SQL 存储 监控
深入可观测底层:OpenTelemetry 链路传递核心原理
本文会系统讲解链路传递一些基本概念,同时结合案例讲解链路传递的过程。
3591 1
深入可观测底层:OpenTelemetry 链路传递核心原理
|
存储 Prometheus Kubernetes
OpenTelemetry 简析
OpenTelemetry 是 CNCF 的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题,提供与三方 vendor 无关的服务。 2021.02.10,OpenTelemetry 的 tracing spec 达到 1.0 版本 (link),基于这个里程碑,笔者对 OpenTelemetry 进行了探索,判断在可观测性领域带来的价值和发展前景。 下面给出笔者对 OpenTelemetry 的理解,抛砖引玉。由于笔者能力有限,理解不当的地方请大家指正。
OpenTelemetry 简析
|
Ubuntu Linux Android开发
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
本文介绍了如何在Android设备上安装Termux和AnLinux,并通过这些工具运行Ubuntu系统和桌面环境。
3196 3
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
华为手机连不上adb解决方法
1.关闭qq,豌豆荚等一连接usb自动侦测手机的程序。。。 2.安装hisuite软件,这个应该跟相应的版本有关,新版本最好要安装这个软件,否则也可能导致怎么都连接不上 3.打开usb调试功能 4.
5688 0
|
Go 网络安全 开发工具
终极攻略!go get命令使用教程
终极攻略!go get命令使用教程
4842 0
|
存储 中间件 测试技术
gRPC(六)进阶:拦截器 interceptor
拦截器本质上就是一个特定类型的函数,所以实现拦截器只需要实现对应类型方法(方法签名相同)即可。
1533 1
gRPC(六)进阶:拦截器 interceptor
|
SQL 数据采集 运维
袋鼠云数栈 DataOps 数据生产力实践,实现数据流程的自动化和规范化
袋鼠云数栈在7年多的研发历程中为上千家客户提供了数据生产效率提升解决方案,也在这个过程中不断地将 DataOps 的理念融合到产品中,助力越来越多的企业成功实现数字化转型升级。本文将就数栈基于 DataOps 的敏捷、高质量数据生产力实践进行分享,希望对大家有所帮助。
645 0
|
XML JSON Java
Protobuf 语法详解
Protobuf 语法详解
634 0

热门文章

最新文章