1
文件上传的必要前提
A form
表单的
enctype
取值必须是:
multipart/form-data
(
默认值是
:application/x-www-form-urlencoded)
enctype:
是表单请求正文的类型
B method
属性取值必须是
Post
C
提供一个文件选择域
<input type=”file” />
2
文件上传的原理分析
当
form
表单的
enctype
取值不是默认值后,
request.getParameter()
将失效
。
enctype=”application/x-www-form-urlencoded”
时,
form
表单的正文内容是:
key=value&key=value&key=value
当
form
表单的
enctype
取值为
Mutilpart/form-data
时,请求正文内容就变成:
每一部分都是
MIME
类型描述的正文
-----------------------------7de1a433602ac
分界符
Content-Disposition: form-data; name="userName"
协议头
aaa
协议的正文
-----------------------------7de1a433602ac
Content-Disposition: form-data; name="file";
filename="C:\Users\zhy\Desktop\fileupload_demofile\b.txt"
Content-Type: text/plain
协议的类型(
MIME
类型)
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-----------------------------7de1a433602ac--
3
借助第三方组件实现文件上传
使用 Commons-fileupload 组件实现文件上传,需要导入该组件相应的支撑 jar 包:Commons-fileupload 和
commons-io。commons-io 不属于文件上传组件的开发 jar 文件,但Commons-fileupload 组件从 1.1 版本开始,它
工作时需要 commons-io 包的支持。
第一步:拷贝文件上传的
jar
包到工程的
lib
目录
第二步:编写 jsp
页面
<
form
action
=
"/fileUpload"
method
=
"post"
enctype=
"multipart/form-data"
>
名称:
<
input
type
=
"text"
name
=
"picname"
/><
br
/>
图片:
<
input
type
=
"file"
name
=
"uploadFile"
/><
br
/>
<
input
type
=
"submit"
value
=
"
上传
"
/>
</
form
>
第三步:编写控制器
@Controller
(
"fileUploadController"
)
public class
FileUploadController {
/**
*
文件上传
*/
@RequestMapping
(
"/fileUpload"
)
public
String testResponseJson(String
picname
,MultipartFile
uploadFile
,HttpServletRequest
request
)
throws
Exception{
//
定义文件名
String
fileName
=
""
;
//1.
获取原始文件名
String
uploadFileName
=
uploadFile
.getOriginalFilename();
//2.
截取文件扩展名
String
extendName
=
uploadFileName
.substring(
uploadFileName
.lastIndexOf(
"."
)+1,
uploadFileName
.length());
//3.
把文件加上随机数,防止文件重复
String
uuid
= UUID.
randomUUID
().toString().replace(
"-"
,
""
).toUpperCase();
//4.
判断是否输入了文件名
if
(!StringUtils.
isEmpty
(
picname
)) {
fileName
=
uuid
+
"_"
+
picname
+
"."
+
extendName
;
}
else
{
fileName
=
uuid
+
"_"
+
uploadFileName
;
}
System.
out
.println(
fileName
);
//2.
获取文件路径
ServletContext
context
=
request
.getServletContext();
String
basePath
=
context
.getRealPath(
"/uploads"
);
//3.
解决同一文件夹中文件过多问题
String
datePath
=
new
SimpleDateFormat(
"yyyy-MM-dd"
).format(
new
Date());
//4.
判断路径是否存在
File
file
=
new
File(
basePath
+
"/"
+
datePath
);
if
(!
file
.exists()) {
file
.mkdirs();
}
//5.
使用
MulitpartFile
接口中方法,把上传的文件写到指定位置
uploadFile
.transferTo(
new
File(
file
,
fileName
));
return
"success"
;
}
}
第四步:配置文件解析器
<!--
配置文件上传解析器
-->
<
bean
id
=
"multipartResolver"
<!-- id
的值是固定的
-->
class
=
"org.springframework.web.multipart.commons.CommonsMultipartResolver"
>
<!--
设置上传文件的最大尺寸为
5MB -->
<
property
name
=
"maxUploadSize"
>
<
value
>
5242880
</
value
>
</
property
>
</
bean
>
注意:
文件上传的解析器
id
是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其他
字段也将无法绑定)