Spring BootからS3にファイルをアップロードする方法




Spring Bootで使用するプラグイン設定

build.gradle全てを載せているので必要ないものも入っています。

S3に必要な設定にはコメントをつけてます。

buildscript {
	ext {
		kotlinVersion = '1.1.4-3'
		springBootVersion = '1.5.6.RELEASE'
		springCloudVersion = '1.2.1.RELEASE'// 必要
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
		classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
		classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
		classpath "io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE"// 必要
	}
}

apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'// 必要

dependencyManagement {
     imports {
          mavenBom 'org.springframework.cloud:spring-cloud-aws:1.2.2.BUILD-SNAPSHOT'// 必要
     }
}

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
compileKotlin {
	kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
	kotlinOptions.jvmTarget = "1.8"
}

repositories {
	mavenCentral()
	maven { url 'https://repo.spring.io/libs-snapshot' }// 必要
}


dependencies {
	compile('org.springframework.boot:spring-boot-starter-web')
	compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}")
	compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
	compile("org.springframework.cloud:spring-cloud-aws-context:${springCloudVersion}")// 必要
}

環境

環境はEclipseとgradleで構築しています。バージョンは下記を参照してください。

  • Kotlin:1.1.4-3
  • Spring Boot:1.5.6.RELEASE
  • Spring Cloud:1.2.1.RELEASE

AWSの認証設定

Spring BootからS3にアクセスできるようにapplication.yamlまたはpropertiesに認証情報とリージョンを設定します。

別の方法として、S3にアクセスできるIAM RoleをEC2に設定することでも可能です。

cloud.aws:
  credentials:
    accessKey: ACCESSKEY
    secretKey: SECRETKEY
  region:
    static: ap-northeast-1
    auto: false

アップロード処理

アップロードにはAmazonS3ClientのputObject()メソッドを使用します。

PutObjectRequestにバケット名とディレクトリ、ファイル名を指定するとその設定でバケット内に保存されます。

package com.sample.aws

import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.CannedAccessControlList
import com.amazonaws.services.s3.model.ObjectMetadata
import com.amazonaws.services.s3.model.PutObjectRequest
import com.amazonaws.services.s3.model.PutObjectResult
import org.apache.tomcat.util.http.fileupload.IOUtils
import org.springframework.stereotype.Component
import org.springframework.web.multipart.MultipartFile
import java.io.InputStream

@Component
class S3 {

    var amazonS3Client: AmazonS3Client = AmazonS3Client()

    /**
     * S3にファイルアップロード
     *
     * @param file アップロードするファイル
     * @return アップロード結果
     */
    fun upload(file: MultipartFile): PutObjectResult {
        val inputStream: InputStream = file.getInputStream()
        val fileName: String = file.getOriginalFilename()
        val putObjectRequest: PutObjectRequest = PutObjectRequest("sample-bucket/directory-path", fileName, inputStream, ObjectMetadata());
        putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead);
        val putObjectResult: PutObjectResult = amazonS3Client.putObject(putObjectRequest);
        IOUtils.closeQuietly(inputStream);
        return putObjectResult;
    }
}

Curlでテストを行う

リクエストパラメータとして-F “file=@/sample.json”とするとローカルファイルを送ることができるのでCurlを使うとテストが楽に行えます。

curl -X POST http://127.0.0.1:8080/s3/upload  -F "file=@/sample.json"

関連情報

おすすめ書籍

Springの概要からインストール方法、各コア機能(Security, Sessionなど)の解説が体系的にまとめられています。2018年に出版されたばかりなので情報も新しいです。これからSpring Bootでアプリケーション開発をしたい方の最初に読む一冊としておすすめします。対象は初心者だけでなく上級者まで幅広く学べるので是非読んでみてください!

 

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です