SPRING BOOT
Cách sử dụng Spring Scheduled trong Spring Boot Hướng dẫn CRUD với Spring Boot, REST và AngularJS trong Java Hướng dẫn Upload file với Spring Boot trong Java Hướng dẫn download file với Spring Boot trong Java Hướng dẫn Upload file với Spring Boot và jQuery Ajax trong Java Spring Boot là gì? Tại sao sử dụng Spring Boot trong Java Cài đặt Spring Boot trong Java, code một project Spring Boot cơ bản RESTful API là gì? Cách hoạt động của RESTful API trong Spring Boot RESTful API hoạt động qua giao thức HTTP như thế nào? CRUD đơn giản với RESTful API trong Spring Boot Java Các thuộc tính của Spring Boot trong Java Hướng dẫn sử dụng Thymeleaf và Spring Boot trong Java Hướng dẫn sử dụng FreeMarker với Spring Boot trong Java Hướng dẫn sử dụng JSP và Spring Boot trong Java Cách dùng Logging trong Spring Boot Kiến trúc 3layer trong Spring Boot là gì? Cách hoạt động thế nào? Hướng dẫn sử dụng Apache Tiles với Spring Boot trong Java Sử dụng nhiều ViewResolver trong Spring Boot Java Giới thiệu về Spring Boot Actuator trong ứng dụng Spring Boot Cách dùng Spring JDBC trong ứng dụng Spring Boot Java Spring Data JPA trong Spring Boot là gì? Spring Data JPA có gì hay? Tương tác giữa Spring Boot, JPA và cơ sở dữ liệu H2 Cách dùng Spring Email trong Spring Boot Sử dụng @bean trong ứng dụng Spring Boot Cách chuyển HTTP sang HTTPS trong Spring Boot Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication trong Java Cách dùng Spring Security trong Spring Boot để xác thực và phân quyền Cách triển khai Spring Boot trên Tomcat Server Sử dụng JUnit để tạo unit test trong Spring Boot Cách test RESTful API trong Spring Boot Tạo ứng dụng Chat với Spring Boot và Websocket Tạo trang web đa ngôn ngữ với Spring Boot trong Java Sử dụng Twitter Bootstrap trong Spring Boot Hướng dẫn sử dụng Interceptor trong Spring Boot Cách tạo Restful Client bằng RestTemplate trong Spring Boot Cách dùng Spring Boot và MongoDB trong Java Cách dùng Spring Boot và Mustache trong Java Cách dùng Groovy trong Spring Boot Java
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Hướng dẫn Upload file với Spring Boot trong Java

Cách sử dụng Spring Boot để thực hiện chức năng upload file trong ứng dụng web của bạn bằng ngôn ngữ lập trình Java. Hãy cùng đọc và làm theo từng bước để có thể dễ dàng thực hiện chức năng này trong dự án của mình!

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong bài viết, chúng ta sẽ tìm hiểu cách cấu hình kích thước tập tin, thiết kế form và controller, sử dụng Thymeleaf templates để hiển thị form và kết quả upload, cũng như việc chạy ứng dụng và kiểm tra tính năng upload file.

1. Giới thiệu

Giới thiệu về chức năng upload file trong ứng dụng web

Chức năng upload file là một trong những chức năng quan trọng trong phát triển ứng dụng web. Nó cho phép người dùng tải lên các file như hình ảnh, video, tài liệu hoặc dữ liệu khác từ máy tính của họ lên server.

Bài viết này được đăng tại [free tuts .net]

Với tính năng upload file, người dùng có thể chia sẻ các file của mình với người khác, lưu trữ các tệp tin trên server để truy cập từ bất kỳ đâu, hoặc sử dụng chúng để thực hiện các tác vụ khác trong ứng dụng.

Cách Spring Boot hỗ trợ việc upload file như thế nào?

Spring Boot cung cấp một thư viện hỗ trợ upload file đơn giản và hiệu quả cho phát triển ứng dụng web. Thư viện này được gọi là "Spring Boot Starter Web", cung cấp cho chúng ta một số lớp và phương thức để xử lý các yêu cầu liên quan đến file.

Các lớp và phương thức này bao gồm:

MultipartFile: đây là một đối tượng lớp được cung cấp bởi Spring Boot để đại diện cho một file được tải lên từ phía người dùng.

@RequestParam: là một annotation trong Spring Boot để lấy giá trị của một tham số đầu vào từ một yêu cầu HTTP, bao gồm cả file đã tải lên.

@RestController@Controller: đây là các annotation được sử dụng để khai báo một lớp trong Spring Boot là một REST controller hoặc một controller để xử lý các yêu cầu liên quan đến file.

ResourceLoader: lớp này được sử dụng để tải file từ thư mục tài nguyên của ứng dụng.

Với những lớp và phương thức này, chúng ta có thể xử lý việc upload file một cách dễ dàng trong Spring Boot.

2. Cấu hình kích thước tập tin

Cách cấu hình kích thước tối đa của tập tin được phép upload

Để cấu hình kích thước tối đa của tập tin được phép upload trong Spring Boot, chúng ta có thể sử dụng thuộc tính spring.servlet.multipart.max-file-sizespring.servlet.multipart.max-request-size trong file application.properties hoặc application.yml.

Các giá trị này được cấu hình dưới dạng byte hoặc kích thước file.

Ví dụ, để giới hạn kích thước file tối đa là 10MB, chúng ta có thể cấu hình như sau:

Trong file application.properties:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

Trong file application.yml:

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB

Cách xử lý lỗi khi kích thước tập tin vượt quá giới hạn

Khi người dùng tải lên file vượt quá giới hạn kích thước tối đa, Spring Boot sẽ trả về một lỗi MaxUploadSizeExceededException. Để xử lý lỗi này, chúng ta có thể sử dụng một @ExceptionHandler trong controller để bắt các ngoại lệ này và trả về một thông báo lỗi thích hợp cho người dùng.

Ví dụ:

@ControllerAdvice
public class FileUploadExceptionAdvice {
 
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ResponseEntity<String> handleMaxSizeException(MaxUploadSizeExceededException exc) {
        return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body("File quá lớn!");
    }
}

Trong ví dụ trên, chúng ta đã sử dụng @ControllerAdvice để đăng ký một @ExceptionHandler để bắt các ngoại lệ MaxUploadSizeExceededException. Khi có ngoại lệ xảy ra, phương thức handleMaxSizeException được gọi và trả về một ResponseEntity chứa thông báo lỗi "File quá lớn!" và mã trạng thái HTTP là EXPECTATION_FAILED.

3. Form & Controller

Tạo form cho người dùng upload tập tin

Để tạo form cho người dùng upload tập tin, chúng ta có thể sử dụng thẻ form và thẻ input với thuộc tính type="file".

Ví dụ:

<form method="POST" action="/upload" enctype="multipart/form-data">
  <input type="file" name="file" />
  <button type="submit">Upload</button>
</form>

Trong ví dụ trên, chúng ta đã sử dụng thuộc tính enctype="multipart/form-data" để đảm bảo dữ liệu được gửi dưới dạng multipart/form-data, cho phép tải lên các file.

Viết controller để xử lý yêu cầu upload tập tin

Sau khi người dùng tải lên file và gửi yêu cầu đến server, chúng ta cần viết một controller để xử lý yêu cầu upload tập tin. Chúng ta có thể sử dụng annotation @PostMapping @RequestParam để đăng ký một phương thức xử lý yêu cầu upload tập tin.

Ví dụ:

@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file, Model model) {
    // xử lý tập tin được tải lên ở đây
    // ...
    return "upload-success";
}

Trong ví dụ trên, chúng ta đã sử dụng annotation @PostMapping("/upload") để đăng ký một phương thức xử lý yêu cầu POST với đường dẫn /upload. Chúng ta đã sử dụng @RequestParam("file") để lấy file được tải lên bởi người dùng. Chúng ta cũng có thể sử dụng các tham số khác như @RequestParam("file") MultipartFile file, @RequestParam("name") String name để lấy các tham số khác từ form.

Xử lý lỗi khi người dùng không chọn tập tin để upload

Nếu người dùng không chọn file để tải lên, chúng ta có thể xử lý lỗi bằng cách kiểm tra xem MultipartFile có rỗng hay không.

Ví dụ:

@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file, Model model) {
    if (file.isEmpty()) {
        model.addAttribute("message", "Vui lòng chọn file để tải lên!");
        return "upload-error";
    }
    // xử lý tập tin được tải lên ở đây
    // ...
    return "upload-success";
}

Trong ví dụ trên, chúng ta đã kiểm tra xem file có rỗng hay không bằng cách sử dụng isEmpty() và trả về một trang lỗi với thông báo "Vui lòng chọn file để tải lên!".

4. Thymeleaf Templates

Cách sử dụng Thymeleaf để hiển thị form và kết quả upload

Để hiển thị form và kết quả upload, chúng ta sẽ sử dụng Thymeleaf - một thư viện template engine cho Java. Thymeleaf cho phép chúng ta tích hợp các biểu thức thymeleaf vào template HTML, giúp chúng ta có thể hiển thị dữ liệu động và xử lý các biểu mẫu HTML.

Đầu tiên, chúng ta sẽ tạo một file template HTML để hiển thị form upload file. Trong thư mục resources/templates, tạo một file upload-form.html với nội dung như sau:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Upload file</title>
</head>
<body>
    <h1>Upload file</h1>

    <form th:action="@{/upload}" th:object="${uploadForm}" method="post" enctype="multipart/form-data">
        <div>
            <label for="file">Select file to upload:</label>
            <input type="file" th:field="*{file}" id="file" name="file" required/>
            <p th:if="${#fields.hasErrors('file')}" th:errors="*{file}">File error message</p>
        </div>
        <button type="submit">Upload</button>
    </form>

    <hr/>

    <h2>Uploaded files</h2>

    <table>
        <thead>
            <tr>
                <th>File name</th>
                <th>Size</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
            <tr th:each="file : ${files}">
                <td th:text="${file.fileName}">File name</td>
                <td th:text="${file.size}">File size</td>
                <td>
                    <a th:href="@{/download/{id}(id=${file.id})}">Download</a>
                    <a th:href="@{/delete/{id}(id=${file.id})}" onclick="return confirm('Are you sure?')">Delete</a>
                </td>
            </tr>
        </tbody>
    </table>
</body>
</html>

Trong template này, chúng ta sử dụng các biểu thức Thymeleaf để hiển thị form upload file và danh sách các file đã được upload. Đối tượng uploadForm trong biểu thức th:object sẽ được đưa vào từ controller. Các biểu thức th:field th:errors sẽ giúp hiển thị và xử lý lỗi của form.

Thực hiện các thao tác CRUD trên danh sách tập tin đã upload

Sau khi người dùng đã upload các tập tin thành công, chúng ta sẽ lưu trữ thông tin của các tập tin này vào cơ sở dữ liệu và hiển thị chúng trong danh sách trên trang web.

Để thực hiện điều này, chúng ta sẽ thực hiện các thao tác CRUD trên danh sách tập tin đã upload. Để làm được điều này, chúng ta sẽ sử dụng Spring Data JPA, một công nghệ rất phổ biến trong các ứng dụng Java để thao tác với cơ sở dữ liệu.

Bước 1: Tạo một Entity để đại diện cho các tập tin đã upload

Trước tiên, chúng ta cần tạo một Entity để đại diện cho các tập tin đã upload. Trong package model, tạo một class FileEntity.java với nội dung như sau:

@Entity
@Table(name = "files")
public class FileEntity {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
 
    private String fileName;
 
    private String fileType;
 
    @Lob
    private byte[] data;
 
    // Constructors, getters and setters omitted for brevity
}

Trong class này, chúng ta sử dụng các annotation của JPA để chỉ định rằng class này là một Entity và sẽ được lưu trữ trong bảng "files" trong cơ sở dữ liệu.

Các trường trong Entity này bao gồm:

  • id: là trường đại diện cho khóa chính của bảng, được tự động tạo ra bởi cơ sở dữ liệu khi thêm mới một bản ghi vào bảng.
  • fileName: là tên của tập tin đã upload.
  • fileType: là loại tập tin đã upload.
  • data: là dữ liệu của tập tin đã upload, được lưu trữ dưới dạng mảng byte[].

Bước 2: Tạo một Repository để thao tác với Entity

Tiếp theo, chúng ta cần tạo một Repository để thực hiện các thao tác CRUD trên Entity. Trong package repository, tạo một interface FileRepository.java với nội dung như sau:

@Repository
public interface FileRepository extends JpaRepository<FileEntity, Long> {
 
}

Bước 3: Thêm dữ liệu vào Repository khi upload file thành công

Khi người dùng upload một tập tin thành công, chúng ta sẽ lưu thông tin của tập tin này vào cơ sở dữ liệu bằng cách thêm một bản ghi mới vào Repository. Để làm được điều này, chúng ta sẽ thực hiện các thao tác CRUD trên danh sách tập tin đã upload. Trong package controller, tạo một file FileController.java với nội dung như sau:

@Controller
public class FileController {
    
    @Autowired
    private FileStorageService fileStorageService;
    
    @GetMapping("/")
    public String listUploadedFiles(Model model) {
        model.addAttribute("files", fileStorageService.loadAll().map(
                path -> MvcUriComponentsBuilder.fromMethodName(FileController.class,
                        "serveFile", path.getFileName().toString()).build().toUri().toString())
                .collect(Collectors.toList()));
        return "upload-list";
    }
    
    @GetMapping("/files/{filename:.+}")
    @ResponseBody
    public ResponseEntity<Resource> serveFile(@PathVariable String filename) {
        Resource file = fileStorageService.loadAsResource(filename);
        return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION,
                "attachment; filename=\"" + file.getFilename() + "\"").body(file);
    }
    
    @PostMapping("/delete")
    public String deleteFile(@RequestParam("filename") String filename) {
        fileStorageService.delete(filename);
        return "redirect:/";
    }
    
}

Trong đó, chúng ta sử dụng fileStorageService để lấy danh sách các tập tin đã upload và hiển thị chúng trên trang upload-form.html. Ngoài ra, chúng ta cũng cung cấp các phương thức để xóa một tập tin với @PostMapping("/delete") và phương thức serveFile() để tải xuống một tập tin đã upload.

Các bạn hãy thực hiện theo các hướng dẫn ở trên đây vào ứng dụgn của mình và cùng kiểm tra kết quả nhé!!

5. Các câu hỏi thường gặp

Tại sao chúng ta cần phải upload file trong ứng dụng web?

Trong nhiều trường hợp, ứng dụng web cần cho phép người dùng tải lên các tập tin như hình ảnh, file văn bản, tài liệu PDF, và video. Ví dụ, trong trang web thương mại điện tử, khách hàng có thể tải lên hình ảnh sản phẩm để hiển thị trên trang web. Trong các ứng dụng quản lý tài liệu, người dùng có thể tải lên tài liệu PDF để lưu trữ và chia sẻ với người khác.

Spring Boot hỗ trợ việc upload file như thế nào?

Spring Boot cung cấp các cách để xử lý việc upload file trong ứng dụng web. Chúng ta có thể sử dụng đối tượng MultipartFile trong Spring Boot để nhận và xử lý các yêu cầu upload file từ người dùng. Spring Boot cũng cung cấp cách cấu hình kích thước tối đa của tập tin được phép upload, cũng như cách xử lý lỗi khi kích thước tập tin vượt quá giới hạn.

Làm thế nào để tạo form cho người dùng upload tập tin và xử lý yêu cầu upload trong Spring Boot?

Để tạo form cho người dùng upload tập tin trong Spring Boot, chúng ta cần sử dụng thẻ form trong HTML và cung cấp đường dẫn đến controller để xử lý yêu cầu upload. Trong controller, chúng ta sử dụng đối tượng MultipartFile để nhận tập tin được upload từ người dùng và lưu trữ nó trong ổ đĩa cục bộ hoặc lưu trữ trong cơ sở dữ liệu. Chúng ta cũng cần xử lý lỗi khi người dùng không chọn tập tin để upload.

6. Kết bài viết

Trong bài viết này chúng ta đã tìm hiểu cách sử dụng Spring Boot để hỗ trợ việc upload file trong ứng dụng web của mình. Hy vọng rằng bài viết này đã giúp bạn hiểu rõ hơn về cách thức Spring Boot hỗ trợ việc upload file và có thể áp dụng vào ứng dụng của mình. Nếu bạn có bất kỳ câu hỏi hoặc đóng góp nào, hãy để lại comment bên dưới. Chúng tôi rất trân trọng và cảm ơn sự quan tâm của bạn đến bài viết này.

Cùng chuyên mục:

Hướng dẫn Upload file với Spring Boot và jQuery Ajax trong Java

Hướng dẫn Upload file với Spring Boot và jQuery Ajax trong Java

Hướng dẫn download file với Spring Boot trong Java

Hướng dẫn download file với Spring Boot trong Java

Hướng dẫn CRUD với Spring Boot, REST và AngularJS trong Java

Hướng dẫn CRUD với Spring Boot, REST và AngularJS trong Java

Cách sử dụng Spring  Scheduled trong Spring Boot

Cách sử dụng Spring Scheduled trong Spring Boot

Cách dùng Groovy trong Spring Boot Java

Cách dùng Groovy trong Spring Boot Java

Cách dùng Spring Boot và Mustache trong Java

Cách dùng Spring Boot và Mustache trong Java

Cách dùng Spring Boot và MongoDB trong Java

Cách dùng Spring Boot và MongoDB trong Java

Cách tạo Restful Client bằng RestTemplate trong Spring Boot

Cách tạo Restful Client bằng RestTemplate trong Spring Boot

Hướng dẫn sử dụng Interceptor trong Spring Boot

Hướng dẫn sử dụng Interceptor trong Spring Boot

Sử dụng Twitter Bootstrap trong Spring Boot

Sử dụng Twitter Bootstrap trong Spring Boot

Tạo trang web đa ngôn ngữ với Spring Boot trong Java

Tạo trang web đa ngôn ngữ với Spring Boot trong Java

Tạo ứng dụng Chat với Spring Boot và Websocket

Tạo ứng dụng Chat với Spring Boot và Websocket

Sử dụng JUnit để tạo unit test trong Spring Boot

Sử dụng JUnit để tạo unit test trong Spring Boot

Cách triển khai Spring Boot trên Tomcat Server

Cách triển khai Spring Boot trên Tomcat Server

Cách test RESTful API trong Spring Boot

Cách test RESTful API trong Spring Boot

Cách dùng Spring Security trong Spring Boot để xác thực và phân quyền

Cách dùng Spring Security trong Spring Boot để xác thực và phân quyền

Duyệt cây nhị phân bằng phương pháp inOder trong Java

Duyệt cây nhị phân bằng phương pháp inOder trong Java

Xóa node của cây nhị phân tìm kiếm trong Java

Xóa node của cây nhị phân tìm kiếm trong Java

Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication trong Java

Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication trong Java

Xác định đường biên(boundary traversal) của cây nhị phân trong Java

Xác định đường biên(boundary traversal) của cây nhị phân trong Java

Top