restful api上傳文件(基礎)-springboot

基於restful api格式的文件上傳(只是上傳到本地):java

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 { @PostMapping public 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); return new FileInfo(localFile.getAbsolutePath()); } }

 

測試用例:web

//僞造的mvc環境
 @Autowired private WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Before public void before() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public 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()) .andReturn().getResponse().getContentAsString(); System.out.println(file); }

測試用例執行完以後輸出文件絕對路徑:spring

{"path":"G:\\mysecurity\\mysecurity-demo\\src\\main\\java\\com\\nxz\\controller\\1556463660034.txt"}

 

 

下載:api

@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/1tomcat

 

 

springboot中上傳文件:springboot

java中和文件上傳的類又兩個:CommonsMultipartResolver,另外一個就是StandardServletMultipartResolver,其中commonsMultipartResolver須要commons-fileupload支持,二StandardServletMultipartReslover是servlet3.0默認支持的,tomcat7以上版本就開始支持servlet7.0,springboot22.0以後支持的tomcat版本在7以後,所以是支持StandardServletMultipartReslover的restful

首先 springboot只要配置好pom(有spring-boot-starter-web依賴),就能自動支持文件上傳(包括單文件和多文件),那麼springboot中文件上傳是怎樣起做用的mvc

一、pom依賴,下邊這些依賴中,和配置文件上傳有關的就是spring-boot-autoconfig依賴app

<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>

 

二、那麼看下spring-boot-autoconfig jar包中的spring.factories文件中的內容,這個文件中全都是和springboot自動配置相關的類的全文件名,其中和文件上傳有關的是spring-boot

org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\

三、進入這個類中(具體個各類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() { return 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()); return multipartResolver; } }
相關文章
相關標籤/搜索