Servlet 3.0规范的HttpServletRequest已经提供了方法来处理文件上传但这种上传需要在Servlet中完成。而Struts2则提供了更简单的封装。
Struts2默认使用的是Jakarta的Common-FileUpload的文件上传框架,因此使用Struts2的文件上传功能,则需要添加两个jar包,即commons-io-2.2.jar和commons-fileupload-1.3.1.jar。
Struts2简单文件上传示例:
1.文件上传页面
为了能上传文件,表单的method必须设置为POST,并且enctype设置为multipart/form-data。一旦设置了enctype为multipart/form-data,此时浏览器将会采用二进制流的方式来处理表单数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018/1/16
Time: 14:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
< html >
< head >
< title >Struts2 简单文件上传</ title >
</ head >
< body >
< s:form action = "file_upload" method = "POST" enctype = "multipart/form-data" >
< s:file name = "upload" label = "选择文件" />
< s:submit value = "上传" />
</ s:form >
</ body >
</ html >
|
2.处理上传请求的Action
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/**
* Description:Struts2简单文件上传
* Author: Eleven
* Date: 2018/1/24 10:39
*/
public class FileAction extends ActionSupport{
//上传文件
private File upload;
//上传文件类型
private String uploadContentType;
//上传文件名
private String uploadFileName;
//文件上传允许的类型在struts.xml中使用param标签动态设置了
private String allowTypes;
public String page(){
return "page" ;
}
public void upload() {
//文件上传:
//1.读取文件内容
//2.将文件内容写到指定文件
try {
System.out.println( "文件上传允许的类型=" +allowTypes);
String realPath = ServletActionContext.getServletContext().getRealPath( "/upload" );
System.out.println( "项目的绝对路径=" +realPath);
//创建文件保存目录
new File(realPath).mkdir();
File file = new File(realPath+ "/" +uploadFileName);
//文件不存在则创建
if (!file.exists()){
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
FileInputStream in = new FileInputStream(upload);
byte [] buffer = new byte [ 1024 ];
int len = 0 ;
//边读边写 每次读取1kb 写1kb
while ((len = in.read(buffer))> 0 ){
out.write(buffer, 0 ,len);
}
System.out.println( "文件上传成功..." );
} catch (Exception e){
e.printStackTrace();
}
}
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 uploadFileName) {
this .uploadFileName = uploadFileName;
}
public String getAllowTypes() {
return allowTypes;
}
public void setAllowTypes(String allowTypes) {
this .allowTypes = allowTypes;
}
}
|
如果表单中包含一个name属性为xxx的文件域,则对应的Action中需要使用三个成员变量来封装该文件域的信息。
类型为File的xxx成员变量封装了该文件域对应的文件内容。
类型为String的xxxFileName成员变量封装了该文件域对应的文件的文件名。
类型为String的xxxContentType成员变量封装了该文件域对应的文件的文件类型。
3.配置struts.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<? 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 >
< constant name = "struts.enable.DynamicMethodInvocation" value = "false" />
< constant name = "struts.devMode" value = "true" />
< package name = "default" namespace = "/" extends = "struts-default" >
<!--文件上传-->
< action name = "file_*" class = "eleven.action.FileAction" method = "{1}" >
< result name = "page" >/WEB-INF/jsp/fileUpload.jsp</ result >
<!--动态设置action的属性,这里举例设置了允许文件上传的类型,但是action程序中并未做过多的处理-->
< param name = "allowTypes" >image/png,image/gif,image/jpeg</ param >
</ action >
</ package >
</ struts >
|
拦截器实现文件过滤
Struts2提供了一个文件上传的拦截器,fileUpload,为了让该拦截器起作用,要在action中配置拦截器引用。
配置fileUpload拦截器时,可以为其指定两个参数:
allowTypes:允许上传的文件类型,多个文件类型之间用英文逗号,隔开
maximumSize:允许上传的文件大小,单位是字节。
当文件过滤失败后,系统自动转入input逻辑视图,因此必须为该Action配置名为input的逻辑视图。除此之外,还必须显示地为该Action配置defaultStack的拦截器引用。
struts.xml配置文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<? 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 >
< constant name = "struts.enable.DynamicMethodInvocation" value = "false" />
< constant name = "struts.devMode" value = "true" />
< package name = "default" namespace = "/" extends = "struts-default" >
<!--文件上传-->
< action name = "file_*" class = "eleven.action.FileAction" method = "{1}" >
<!--配置fileUpload拦截器 且配置在defaultStack拦截器栈之前-->
< interceptor-ref name = "fileUpload" >
<!--允许上传的文件类型-->
< param name = "allowedTypes" >image/png,image/gif,image/jpeg</ param >
<!--允许上传文件大小-->
< param name = "maximumSize" >2000</ param >
</ interceptor-ref >
<!--配置系统默认拦截器-->
< interceptor-ref name = "defaultStack" />
<!--配置input视图页面-->
< result name = "input" >/WEB-INF/jsp/input.jsp</ result >
< result name = "page" >/WEB-INF/jsp/fileUpload.jsp</ result >
</ action >
</ package >
</ struts >
|
上面配置的文件上传的拦截器,要求文件上传的类型只能是图片文件,并且文件大小不能大于2000字节,如果上传文件太大,或者类型不符合,则将跳转到input逻辑视图。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/eleven258/archive/2018/01/26/8358159.html