springboot(四):輕鬆搞定文件上傳下載

上傳文件

默認狀況下springboot不須要作任何配製便可完成上傳文件,但有可能因默認配置不符而致使文件上傳失敗問題,因此瞭解相關配置信息更有助於咱們對問題的定位和修復;前端

配製
# 是否支持批量上傳   (默認值 true)
spring.servlet.multipart.enabled=true
# 上傳文件的臨時目錄 (通常狀況下不用特地修改)
spring.servlet.multipart.location=
# 上傳單個文件最大爲 1M (默認值 1M 根據自身業務自行控制便可)
spring.servlet.multipart.max-file-size=1048576
# 上傳全部文件總最大爲 10M(默認值10M 根據自身業務自行控制便可)
spring.servlet.multipart.max-request-size=10485760
# 文件大小閾值,當大於這個閾值時將寫入到磁盤,不然存在內存中,(默認值0 通常狀況下不用特地修改)
spring.servlet.multipart.file-size-threshold=0
# 判斷是否要延遲解析文件(至關於懶加載,通常狀況下不用特地修改)
spring.servlet.multipart.resolve-lazily=false

前端代碼java

<h2>單一文件上傳示例</h2>
<div>
    <form method="POST" enctype="multipart/form-data" action="/uploads/singleUpload">
            文件1:<input type="file" name="file"/>
            <input type="submit" value="上傳"/>
    </form>
</div>
<hr/>
<h2>批量文件上傳示例</h2>
<div>
    <form method="POST" enctype="multipart/form-data"
          action="/uploads/multiUpload">
            文件1:<input type="file" name="file"/>
            文件2:<input type="file" name="file"/>
            <input type="submit" value="上傳"/>
    </form>
</div>

後端代碼:spring

@PostMapping("/singleUpload")
    @ResponseBody
    public Map<String, String> singleUpload(@RequestParam("file") MultipartFile file) throws Exception {
        log.info("[文件類型] - [{}]", file.getContentType());
        log.info("[文件大小] - [{}]", file.getSize());
        file.transferTo(new File("F:\\test\\" + file.getOriginalFilename()));
        Map<String, String> result = new HashMap<>(2);
        result.put("contentType", file.getContentType());
        result.put("fileName", file.getOriginalFilename());
        result.put("fileSize", file.getSize() + "");
        return result;
    }

    @PostMapping("/multiUpload")
    @ResponseBody
    public List<Map<String, String>> multiUpload(@RequestParam("file") MultipartFile[] files) throws Exception {
        if (files == null || files.length == 0)return null;
        List<Map<String, String>> results = new ArrayList<>();
        for (MultipartFile file : files) {
            file.transferTo(new File("F:\\test\\" + file.getOriginalFilename()));
            Map<String, String> map = new HashMap<>(2);
            map.put("contentType", file.getContentType());
            map.put("fileSize", file.getSize() + "");
			result.put("fileName", file.getOriginalFilename());
            results.add(map);
        }
        return results;
    }
常見問題

在項目開發中,一直是正常的,上傳了個文件忽然就報錯了,報錯信息以下:後端

Caused by: java.io.IOException: The temporary upload location [C:\Users\admin\AppData\Local\Temp\tomcat.8572785615189560421.8080\work\Tomcat\localhost\ROOT] is not valid

通過一番辛苦的查找,原來是spring boot 內部上傳文件臨時存儲路徑不存在了,如今有兩種辦法:tomcat

  • 第一種:配製 spring.servlet.multipart.location 這個屬性springboot

  • 第二種:注入一個Bean,手動添設置下臨時存儲路徑,代碼以下:app

@Bean
public MultipartConfigElement multipartConfigElement() {
   MultipartConfigFactory factory = new MultipartConfigFactory();
   factory.setLocation("d://temp");
   return factory.createMultipartConfig();
}

下載文件

在springboot裏,咱們下載文件除了傳統模式的將文件流寫入到response,而後實現下載以外還能夠經過ResponseEntity來實現:code

@RequestMapping(value = "/download", method = RequestMethod.GET)
public ResponseEntity<FileSystemResource> download(Integer id) {
        File file = new File("c:\\test"+id+".xls")
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Content-Disposition", "attachment; filename=" + System.currentTimeMillis() + ".xls");
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        return ResponseEntity
                .ok()
                .headers(headers)
                .contentLength(file.length())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(new FileSystemResource(file));
    }

相關文章
相關標籤/搜索