multipart格式的数据 会将 一个表单拆分为 多个部分,每个部分对应一个输入域。
在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是二进制。
配置 multipart 解析器:
有两个:
commonsmultipartresolver:使用 jakarta commons fileupload 解析 multiparty。standardservletmultipartresolver:依赖于 servlet 3.0 对 multipart 请求的支持。
配置 standardservletmultipartresolver 解析器
1、在applicationcontext 中声明为 bean:
@bean
public multipartresolver multipartresolver(){
return new standardservletmultipartresolver();
}
2、在 web.xml 或 servlet 初始化类中,配置 multipart 的具体细节,如:文件大写,临时文件路径等。
- 如果已经实现了 webapplicationinitializer 接口,可以在servlet registration 上调用
setmultipartconfig()方法进行配置:
@override
public void onstartup(servletcontext servletcontext) throws servletexception {
dispatcherservlet dispatcherservlet = new dispatcherservlet();
servletregistration.dynamic registration = servletcontext.addservlet("appservlet", dispatcherservlet);
registration.addmapping("/");
registration.setmultipartconfig(new multipartconfigelement("/tmp/uploads"));
}
- 若 初始化 类 继承了
abstractannotationconfigdispatcherservletinitializer或abstractdispatcherservletinitializer通过重写customizeregistration方法 来配置multipart的具体细节
@override
protected void customizeregistration(servletregistration.dynamic registration) {
registration.setmultipartconfig(
new multipartconfigelement("/tmp/test/uploads")
);
}
了解 multipartconfigelement 类:
new multipartconfigelement("/tmp/test/uploads",2097152,4194304,0)
- 指定 临时存放目录 为
/tmp/test/uploads。 - 上传文件的最大容量:
2097152= 2mb。 - 整个 multipart 请求的最大容量
4194304= 4mb。 - 文件大写 达到一定容量,会写入 临时文件路径中,默认是 0,所有上传的文件都会写入磁盘中。
对应 在 web.xml 中的配置:
<servlet>
<servlet-name>appservlet</servlet-name>
<servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
<load-on-startup>1</load-on-startup>
<multipart-config>
<!-- 临时路劲 -->
<location>/tmp/test/uploads</location>
<!-- 上传文件的最大值 -->
<max-file-size>2097152</max-file-size>
<!--请求的最大容量-->
<max-request-size>4194304</max-request-size>
</multipart-config>
</servlet>
配置 commonsmultipartresolver 解析器
声明为 bean
@bean
public multipartresolver multipartresolver(){
return new commonsmultipartresolver();
}
文件大小,临时路径等在 声明bean 时设置。
@bean
public multipartresolver multipartresolver() throws ioexception {
commonsmultipartresolver multipartresolver = new commonsmultipartresolver();
// 设置 临时目录
multipartresolver.setuploadtempdir(new filesystemresource("/tmp/test/uploads"));
// 最大文件
multipartresolver.setmaxuploadsize(2097152);
multipartresolver.setmaxinmemorysize(0);
return multipartresolver;
}
上传文件、处理文件
表单的大体样式:
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="picture" accept="image/jpeg">
<input type="submit" value="提交">
</form>
enctype="multipart/form-data"告诉 浏览器以 multipart 数据的形式提交表单。accept="image/jpeg"限制文件接收的类型 为 jpeg。
controller 上接收上传的文件
@requestmapping("/upload")
public string uploadimage(@requestpart("picture")multipartfile file) throws ioexception {
// 获取 文件 名
string filename = file.getoriginalfilename();
// 将 上传的文件 写入到 文件系统中
file.transferto(new file("/data/image"+filename));
return "index";
}
- multipartfile 接口,为处理 multipart 数据提供了内容更为丰富的对象。
public interface multipartfile extends inputstreamsource {
string getname();
@nullable
string getoriginalfilename();
@nullable
string getcontenttype();
boolean isempty();
long getsize();
byte[] getbytes() throws ioexception;
inputstream getinputstream() throws ioexception;
default resource getresource() {
return new multipartfileresource(this);
}
void transferto(file var1) throws ioexception, illegalstateexception;
default void transferto(path dest) throws ioexception, illegalstateexception {
filecopyutils.copy(this.getinputstream(), files.newoutputstream(dest));
}
}
可以把 multipartfile 替换为 servlet.http.part
@requestmapping("/upload")
public string uploadimage(@requestpart("picture") part file) throws ioexception {
// 获取 文件 名
string filename = file.getsubmittedfilename();
// 将 上传的文件 写入到 文件系统中
file.write("/data/image"+filename);
return "index";
}
通过 part 参数接收上传文件,那么没有必要 配置 multipartresolver 了。只有使用 multipartfile 的时候,才需要 配置。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论