Java Spring Web ファイルをダウンロード・アップロードするためのエンドポイントを作成する

cloud storage storage medium 7832676
目次

コントローラーの設定

コントローラー

package com.example.xxx;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@RestController
public class XXXController {
    @GetMapping("/file/download")
    public ResponseEntity<Resource> downloadFile() {
        Path path = Paths.get("image/test.jpg");
        Resource resource;
        try {
            resource = new UrlResource(path.toUri());
        } catch (Exception e) {
            throw new RuntimeException("Issue reading the file.", e);
        }
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                .body(resource);
    }

    @Operation(summary = "Upload a file")
    @PostMapping(value = "/file/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<String> uploadFile(@Parameter(description = "File to be uploaded", required = true,
            content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE,
                    schema = @Schema(type = "string", format = "binary")))
                                                     MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.badRequest().body("Cannot upload empty file");
        }

        try {
            byte[] bytes = file.getBytes();
            Path path = Paths.get("image/upload/" + file.getOriginalFilename());
            Files.write(path, bytes);
        } catch (Exception e) {
            return ResponseEntity.status(500).body("Failed to upload the file");
        }

        return ResponseEntity.ok().body("File successfully uploaded");
    }
}

アノテーションの説明

以下がアノテーションの説明です。

  • @Operation(summary = "Upload a file"):
  • このアノテーションは、Swagger UIやその他のAPIドキュメンテーションツールにエンドポイントの説明を提供するためのものです。この場合、エンドポイントの要約として “Upload a file” が表示されます。
  • @PostMapping(value = "/file/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE):
  • Spring Bootのエンドポイントを定義するためのアノテーションです。このエンドポイントは、POSTリクエストを待ち受けており、/file/uploadというURLでアクセス可能です。
  • consumes = MediaType.MULTIPART_FORM_DATA_VALUE は、このエンドポイントがmultipart/form-dataのメディアタイプのデータを受け入れることを意味します。これは、ファイルのアップロードに使用される一般的なコンテンツタイプです。
  • @Parameter アノテーション:
  • このアノテーションは、エンドポイントのパラメータに関する詳細情報を提供します。
    • description = "File to be uploaded": パラメータの説明です。
    • required = true: このパラメータは必須であることを示します。
    • content = @Content(...): ここでは、パラメータのコンテンツタイプやスキーマに関する詳細情報を提供します。
      • mediaType = MediaType.MULTIPART_FORM_DATA_VALUE: パラメータがmultipart/form-dataのメディアタイプを持つことを示します。
      • schema = @Schema(type = "string", format = "binary"): このスキーマ定義は、パラメータがバイナリフォーマットの文字列であることを示しています(この場合、ファイル)。
  • MultipartFile file:
  • これは、Spring Bootが提供するMultipartFile型を使用して、アップロードされたファイルを受け取るための引数です。

要するに、このエンドポイントは、ユーザーがファイルをアップロードすることを許可し、アップロードされたファイルを処理するためのものです。また、Swagger UIでのドキュメンテーションに関する詳細情報も提供されています。

Swaggerでファイルのダウンロードとアップロードの検証

実際にSwaggerで検証してみます。

ダウンロード

Try It Out > Execute > Donload fileでファイルがダウンロードされます。

アップロード

Try It Out > Choose Fileで適当なファイルを選択 > Execute でファイルがアップロードされ、アプリケーションの所定のディレクトリに保存されます。

よかったらシェアしてね!
目次