Code ví dụ Spring Boot Upload file
(Xem lại: Ví dụ Spring MVC Upload file)
(Xem lại: Spring MVC Upload File kết hợp Progress Bar (JQuery, Bootstrap))
Các công nghệ sử dụng:
- Spring Boot 2.0.2
- Maven
- JDK 1.8
- Eclipse + Spring Tool Suite
- Thymeleaf
Tạo Spring Boot Project
Cấu trúc Project
Thư viện sử dụng:
Ngoài các thự viện có sẵn khi tạo spring boot project, mình dùng thêm thư viện commons-fileupload để upload file.
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
Class Model
package stackjava.com.sbuploadfile.model; import java.io.Serializable; import org.springframework.web.multipart.MultipartFile; public class MyFile implements Serializable { private static final long serialVersionUID = 1L; private MultipartFile multipartFile; private String description; public MultipartFile getMultipartFile() { return multipartFile; } public void setMultipartFile(MultipartFile multipartFile) { this.multipartFile = multipartFile; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
MultipartFile là đối tượng file được upload lên
Ở đây ngoài file còn có thể có một số thông tin được submit cùng, ví dụ mình thêm thuộc tính description để submit cùng.
Controller
package stackjava.com.sbuploadfile.controller; import java.io.File; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; import stackjava.com.sbuploadfile.model.MyFile; @Controller public class BaseController { @RequestMapping("/") public String index(Model model) { model.addAttribute("myFile", new MyFile()); return "index"; } @RequestMapping(value = "/uploadFile", method = RequestMethod.POST) public String uploadFile(MyFile myFile, Model model) { model.addAttribute("message", "Upload success"); model.addAttribute("description", myFile.getDescription()); try { MultipartFile multipartFile = myFile.getMultipartFile(); String fileName = multipartFile.getOriginalFilename(); File file = new File(this.getFolderUpload(), fileName); multipartFile.transferTo(file); } catch (Exception e) { e.printStackTrace(); model.addAttribute("message", "Upload failed"); } return "result"; } public File getFolderUpload() { File folderUpload = new File(System.getProperty("user.home") + "/Uploads"); if (!folderUpload.exists()) { folderUpload.mkdirs(); } return folderUpload; } }
Hàm getFolderUpload()
dùng để lấy/tạo folder chứa file upload ở folder của người dùng (một số ví dụ mình fix cứng là D:/files
thành ra máy của một số bạn không có ổ D hoặc chạy Linux nên nó báo không thấy folder/file)
File sau khi được upload, file sẽ được lưu vào folder {user_folder}/Uploads.
Các file view
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>index</title> </head> <body> <h2>Demo Spring Boot Upload File</h2> <form method="post" th:action="@{/uploadFile}" enctype="multipart/form-data" th:object="${myFile}"> File: <input type="file" th:field="*{multipartFile}" /> <br /> <br /> Description: <input type="text" th:field="*{description}" /> <br /> <br /> <input type="submit" value="Submit" /> </form> </body> </html>
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>index</title> </head> <body> <h3 th:text="${message}"></h3> <p>File Description: <span th:text="${description}"></span></p> </body> </html></html>
Lưu ý:
Mặc định kích thước file lớn nhất có thể upload là 1MB. Để tùy chỉnh kích thước file có thể upload, các bạn cấu hình trong file application.properties
Ví dụ mình cho phép file có kích thước lớn nhất có thể upload là 30MB
spring.servlet.multipart.max-file-size=30MB spring.servlet.multipart.max-request-size=30MB
Demo
Mình sử dụng hệ điều hành là windows, tài khoản windows là kai nên file upload sẽ lưu ở folder C:/Users/kai/Uploads