首页 > 编程知识 正文

springboot接收文件,springboot文件上传路径

时间:2023-05-03 09:48:10 阅读:132549 作者:2691

文章目录CommonsMultipartResolver和standardservletmultipartresolver的区别在于, 在配置类中配置CommonsMultipartResolver (未实现文件上传(standardservletmultipartresolver )此文档中可用的方法之一) yaml配置文件rtresolver )本文中可用的方法之一)以实现上载文件的常见异常

SpringMVC文件的上传通过MultipartResolver界面进行。 MultipartResolver接口有两个实现类: CommonsMultipartResolver和standardservletmultipartresolver

CommonsMultipartResolver与standardservletmultipartresolver的区别CommonsMultipartResolver使用commons-fileupload处理multipart请求

(1)公共文件上载

(2) commons-io【 commons-fileupload依赖已经依赖包含了commons-io】dependencygroupidcommons-file upload/groupidartifactidcommons-file upload/groupidartifactidcommons (文件上载) ) dependency启用了commons-fileupload依赖项,并且已经启用了commons-io依赖项dependencygroupidcommmons-ii

CommonsMultipartResolver要使用 Apache 的 commons-fileupload 等 jar 包支持,但它能在比较旧的 servlet 版本中使用。

标准服务器基于servlet 3.0处理了multipart请求。StandardServletMultipartResolver不需要第三方 jar 包支持,它使用 servlet 内置的上传功能,但是只能在 Servlet 3 以上的版本使用。Tomcat7.0开始支持Servlet3.0,SpringBoot2.0.4内置Tomcat是8.5.32,所以可以直接使用StandardServletMultipartResolver。

如果未设置为生成multipartResolver对象,则缺省情况下,SpringBoot提供的文件上载自动配置类MultipartAutoConfiguration中的标准服务器多路径设置如果未提供使用@conditionalonmiguration的多部件资源器,则在中, 默认standardservletmultipartresolver @ conditionalonmissingbean (multipart resolver.class ) ) publicstandardservletmultipapan rtresolvermultipartresolver=newstandardservletmultipartresolver (; 多重resolver.setresolvelazily (this.multipart properties.isresolvelazily ); return multipartResolver; 在配置类中配置CommonsMultipartResolver (本文无法上载文件,仅介绍如何配置) @ beanpublicmultipartresolvermultipartresolver (throwsioexception (commonsmultipartresolvermultipartresolver=newcomonsmultior 与ment对应的locationmultipartresolver.setuploadtempdir (newfilesystemresource ((/tmp/spit tr/uploads ) )。 与多点配置对应的最大文件大小多点r

esolver.setMaxUploadSize(2097152); //对应于MultipartConfigElement的fileSizeThreshold multipartResolver.setMaxInMemorySize(0); return multipartResolver;} 通过配置类中配置StandardServletMultipartResolver(本文可采用的方式之一)

StandardServletMultipartResolver的配置是在Servlet中通过传入一个MultipartConfigElement实例来指定

@Configuration@EnableWebMvc //启用Spring MVCpublic class WebConfig extends WebMvcConfigurationSupport { /** * 配置multipart解析器 * @return */ @Bean public MultipartResolver multipartResolver(){ return new StandardServletMultipartResolver(); } @Beanpublic MultipartConfigElement multipartConfigElement(){ MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setLocation("D:/"); factory.setMaxFileSize(DataSize.ofMegabytes(5)); factory.setMaxRequestSize(DataSize.ofMegabytes(10000)); return factory.createMultipartConfig();}}

如果想限制为KB大小,就使用DataSize.ofKilobytes()这个方法。
如果想限制为MB大小,就使用DataSize.ofMegabytes()这个方法。
如果想限制为字节大小,就使用DataSize.ofBytes()这个方法。

通过yaml配置文件配置StandardServletMultipartResolver(本文可采用的方式之一) server: port: 80spring: servlet: multipart: enabled: true #表示是否开启文件上传支持,默认为 true location: E:/ #用来指定上传文件的临时写入目录,一定要注意是绝对目录 #file-size-threshold表示在文件上传的过程中,如果文件大小达到阈值(以字节为单位),将会写入到临时文件路径中 #默认值为0,所有文件都会写入磁盘的临时文件中,可以使用后缀"MB"或"KB"分别表示兆字节或千字节。不带单位默认为字节 #DataSize.ofKilobytes(10)表示10KB #DataSize.ofMegabytes(10)表示10MB #DataSize.ofBytes(10)表示10B file-size-threshold: 1KB #默认为0,即没有限制 max-file-size: 20MB #上传的单个文件的最大大小,默认为 1MB max-request-size: 200MB #多文件上传时文件的总大小,默认为 10MB resolve-lazily: false #表示文件是否延迟解析,默认为 false 上传文件的实现

上传文件时,form表单的enctype属性需要设置为multipart/form-data,multipart格式的数据会将一个表单拆分成多个部分(part),每个部分对应一个输入域。

package top.onething.file.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import java.io.File;/** * @author LiuWei * @date 2020/7/8 * @description */@RestController@Slf4jpublic class FileController { /** * @param files 多文件 * @param file 单文件 * @功能描述 单文件上传 多文件上传 */ @PostMapping("/upload") public void upload(MultipartFile[] files, MultipartFile file) throws Exception { /* String path = Objects.requireNonNull(Thread.currentThread() .getContextClassLoader().getResource("")).getPath(); System.out.println(path); File parentFile = new File(path + "/file"); if (!parentFile.exists()) { if (parentFile.mkdir()) { throw new Exception("目录存在问题"); } }*/ //多文件处理 for (MultipartFile e : files) { String originalFilename = e.getOriginalFilename(); //因为配置文件中配置了文件上传的存放路径,这里只需要配置文件上传后的名称即可 File dest = new File(originalFilename); //将内存中的数据转存到指定目录 e.transferTo(dest); } //单文件处理 //获取上传文件的原始名称 String originalFilename = file.getOriginalFilename(); log.info("上传文件的大小:" + file.getSize()); log.info("上传文件的类型:" + file.getContentType()); log.info("上传文件时所用的属性名称【key】:" + file.getName()); File dest = new File(originalFilename); file.transferTo(dest); }}

常见异常

(1)单次上传的文件大小超过阈值

解决办法: 调节上传单个文件大小的阈值

spring.servlet.multipart.max-file-size=10

(2)单次请求上传的数据大小超过阈值

解决办法: 调整单次请求上传的数据大小的阈值

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。