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 的时候,才需要 配置。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论