默認狀況下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)); }