springboot 檔案上傳下載
阿新 • • 發佈:2020-12-18
技術標籤:學習筆記springboot
目錄標題
1、引入依賴
引入web和thymeleaf依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
< dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、html頁面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>多檔案上傳</h3>
<form action="/uploads" method="post" enctype="multipart/form-data">
<input type="file" name="mulUploadFile" value="請選擇檔案" multiple> <!-- multiple支援多檔案上傳 -->
<input type="submit" value="上傳檔案">
</form>
<h3>檔案下載</h3>
<a href="/download?filename=3.jpg" >公孫離.jpg</a>
<br>
<a href="/download1?filename=2.jpg" >抽象工廠.jpg</a>
</body>
</html>
3、controller
package com.controller;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
@Controller
public class FileUploadDown {
@ResponseBody
@PostMapping("/uploads")
public String uploads(MultipartFile[] mulUploadFile , HttpServletRequest req){
int i;
for (i = 0; i < mulUploadFile.length; i++) {
if(mulUploadFile[i].isEmpty()){
return "上傳失敗!檔案不能為空!";
}
//獲取原檔名
String fileName = mulUploadFile[i].getOriginalFilename();
//目標路徑
String filePath = "E:/Temp/";
File file = new File(filePath+fileName);
try {
mulUploadFile[i].transferTo(file);
}
catch (IOException e){
e.printStackTrace();
}
}
if(i == mulUploadFile.length) return "檔案上傳成功";
else return "檔案上傳失敗";
}
//檔案下載1,
// 報異常:getOutputStream() has already been called for this response
// 但不影響程式的執行
@GetMapping("/download")
public String download(HttpServletResponse response , HttpServletRequest request){
try{
// 1.得到要下載的檔名稱
String filename = request.getParameter("filename");
filename = new String(filename.getBytes("iso8859-1"), "utf-8"); // 解決中文亂碼
//檔案所在位置
File file = new File("E:\\", filename);
if (file.exists()) {
//設定下載檔案的mimeType
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
// 其它瀏覽器
filename = URLEncoder.encode(filename, "utf-8");
//檔案正常顯示中文
response.setHeader("content-disposition", "attachment;filename="
+ filename);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();// 將要下載的檔案內容通過輸出流寫回到瀏覽器
byte[] b = new byte[1024 * 100];
int len = -1;
int i = bis.read(b);
while (i != -1) {
os.write(b, 0, i);
i = bis.read(b);
}
os.close();
fis.close();
bis.close();
} else {
throw new RuntimeException("下載資源不存在");
}
}catch (IOException e){
}
return "";
}
//檔案下載2
@GetMapping("/download1")
public ResponseEntity<InputStreamResource> downloadFile(HttpServletRequest request) throws IOException {
//獲取檔名
String filename = request.getParameter("filename");
//原始檔所在的路徑
String filePath = "E:\\"+filename;
FileSystemResource file = new FileSystemResource(filePath);
//配置請求頭
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", filename));
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
return ResponseEntity
.ok()
.headers(headers)
.contentLength(file.contentLength())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(new InputStreamResource(file.getInputStream()));
}
}
4、application.properties
# 上傳檔案總的最大值
spring.servlet.multipart.max-request-size=10MB
# 單個檔案的最大值
spring.servlet.multipart.max-file-size=10MB