最近忙着都沒時間寫博客了,作了個項目,實現了下載功能,沒用到上傳,寫這篇文章也是順便參考學習瞭如何實現上傳,上傳和下載作一篇筆記吧html
主要有下面的兩種方式:android
我只測試了ResponseEntity<InputStreamResource>
這種方法可行,另一種方法請各位搜索資料。web
咱們在controller層中,讓某個方法返回ResponseEntity,以後,用戶打開這個url,就會直接開始下載文件spring
這裏,封裝了一個方法export
,負責把File對象轉爲ResponseEntity服務器
public ResponseEntity<FileSystemResource> export(File file) { if (file == null) { return null; } HttpHeaders headers = new HttpHeaders(); headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); headers.add("Content-Disposition", "attachment; filename=" + System.currentTimeMillis() + ".xls");//以時間命名文件,防止出現文件存在的狀況,根據實際狀況修改,我這裏是返回一個xls文件 headers.add("Pragma", "no-cache"); headers.add("Expires", "0"); headers.add("Last-Modified", new Date().toString()); headers.add("ETag", String.valueOf(System.currentTimeMillis())); return ResponseEntity .ok() .headers(headers) .contentLength(file.length()) .contentType(MediaType.parseMediaType("application/octet-stream")) .body(new FileSystemResource(file)); }
Controllerapp
@RequestMapping("download") public ResponseEntity<FileSystemResource> downloadFile() { return excelFileService.getGroupExcel(matchId); }
spring boot使用上傳功能,得先進行配置,spring boot配置方式有兩種,一種是資源文件properties配置,另一種方式則是yml配置webapp
properties配置:jsp
## MULTIPART (MultipartProperties) # 開啓 multipart 上傳功能 spring.servlet.multipart.enabled=true # 文件寫入磁盤的閾值 spring.servlet.multipart.file-size-threshold=2KB # 最大文件大小 spring.servlet.multipart.max-file-size=200MB # 最大請求大小 spring.servlet.multipart.max-request-size=215MB
yml配置:ide
spring: servlet: multipart: enabled: true # 開啓 multipart 上傳功能 max-file-size: 200MB # 最大文件大小 max-request-size: 215MB # 最大文件請求大小 file-size-threshold: 2KB # 文件寫入磁盤的閾值
controllerpost
@PostMapping("/upload") @ResponseBody public String upload(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return "上傳失敗,請選擇文件"; } String fileName = file.getOriginalFilename(); String filePath = "/Users/itinypocket/workspace/temp/";//文件上傳到服務器的路徑,根據實際狀況修改 File dest = new File(filePath + fileName); try { file.transferTo(dest); LOGGER.info("上傳成功"); return "上傳成功"; } catch (IOException e) { LOGGER.error(e.toString(), e); } return "上傳失敗!"; }
注意,input標籤的name與url的請求參數名相同,上傳只能使用post請求
單個文件上傳:
<form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="file"><br> <input type="submit" value="提交"> </form>
多個文件上傳:
input標籤加上multiple
屬性,便可一次選擇多個文件
<form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" multiple name="file"><br> <input type="submit" value="提交"> </form>
使用okhttp上傳文件
RequestBody filebody = RequestBody.create(MediaType.parse("application/octet-stream"), file); RequestBody body = new MultipartBody.Builder() .addFormDataPart("file", file.getName(), filebody) .build(); Request request = new Request.Builder() .url("http://192.168.1.106:8080/webapp/fileUploadPage") .post(body) .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "請求失敗:" + e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { Log.e(TAG, "請求成功!"); } });
參考連接:
spring boot文件下載
Spring Boot 文件上傳與下載
Spring Boot教程(十三):Spring Boot文件上傳
jsp 實現上傳 菜鳥教程