restful api上传文件(基础)-springboot
基于restful api格式的文件上传(只是上传到本地):
package com.nxz.controller;import com.nxz.entity.FileInfo;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOException;import java.util.Date;@RestController@RequestMapping("/file")public class FileController {@PostMappingpublic FileInfo update(MultipartFile file) throws IOException {System.out.println(file.getName());System.out.println(file.getOriginalFilename());System.out.println(file.getSize());String holder = "G:\\0001-myproject\\mysecurity\\mysecurity-demo\\src\\main\\java\\com\\nxz\\controller";File localFile = new File(holder, new Date().getTime() + ".txt");file.transferTo(localFile);retu new FileInfo(localFile.getAbsolutePath());}}
测试用例:
//伪造的mvc环境@Autowiredprivate WebApplicationContext webApplicationContext;private MockMvc mockMvc;@Beforepublic void before() {mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();}@Testpublic void whenUploadSuccess() throws Exception {String file = mockMvc.perform(MockMvcRequestBuilders.fileUpload("/file").file(new MockMultipartFile("file", "test.txt", "multipart/form-data", "hello".getBytes("UTF-8")))).andExpect(MockMvcResultMatchers.status().isOk()).andRetu().getResponse().getContentAsString();System.out.println(file);}
测试用例执行完之后输出文件绝对路径:
{"path":"G:\\mysecurity\\mysecurity-demo\\src\\main\\java\\com\\nxz\\controller\\1556463660034.txt"}
下载:
@GetMapping("/{id}")public void downLoad(@PathVariable String id, HttpServletRequest request, HttpServletResponse response) throws IOException {String holder = "G:\\0001-myproject\\mysecurity\\mysecurity-demo\\src\\main\\java\\com\\nxz\\controller";try (InputStream inputStream = new FileInputStream(new File(holder, id + ".txt"));OutputStream outputStream = response.getOutputStream();) {response.setContentType("application/x-download");response.addHeader("Content-Disposition", "attachment;filename=test.txt");//重新定义下载后名称//将文件输入流复制到输出刘超过年 commons-io依赖IOUtils.copy(inputStream, outputStream);outputStream.flush();}}
访问:http://localhost:8080/user/1
springboot中上传文件:
java中和文件上传的类又两个:CommonsMultipartResolver,另一个就是StandardServletMultipartResolver,其中commonsMultipartResolver需要commons-fileupload支持,二StandardServletMultipartReslover是servlet3.0默认支持的,tomcat7以上版本就开始支持servlet7.0,springboot22.0之后支持的tomcat版本在7之后,因此是支持StandardServletMultipartReslover的
首先 springboot只要配置好pom(有spring-boot-starter-web依赖),就能自动支持文件上传(包括单文件和多文件),那么springboot中文件上传是怎样起作用的
1、pom依赖,下边这些依赖中,和配置文件上传有关的就是spring-boot-autoconfig依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>---->>><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.1.3.RELEASE</version> <scope>compile</scope></dependency>---->>>><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.1.3.RELEASE</version> <scope>compile</scope></dependency>
2、那么看下spring-boot-autoconfig jar包中的spring.factories文件中的内容,这个文件中全都是和springboot自动配置相关的类的全文件名,其中和文件上传有关的是
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
3、进入这个类中(具体个各种autoconfiguration自动加载类是什么时候加载的,需要看springboot的启动来注解和启动类)
@Configuration@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class,MultipartConfigElement.class }) //这个注解表示存在servlet、StandardServletMultipartResolver、multipartConfigElement文件时才加载该类@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)//配置文件的前缀@ConditionalOnWebApplication(type = Type.SERVLET)//servlet@EnableConfigurationProperties(MultipartProperties.class)//配置文件类 public class MultipartAutoConfiguration { private final MultipartProperties multipartProperties; public MultipartAutoConfiguration(MultipartProperties multipartProperties) { this.multipartProperties = multipartProperties; } @Bean @ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class })//当没有commonsMultipartResolver文件时,初始化该bean public MultipartConfigElement multipartConfigElement() { retu this.multipartProperties.createMultipartConfig(); } @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) @ConditionalOnMissingBean(MultipartResolver.class) public StandardServletMultipartResolver multipartResolver() { StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();//springboot默认的文件上传的类 multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily()); retu multipartResolver; } }
作者:xj-record
来源链接:https://www.cnblogs.com/nxzblogs/p/10787705.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。