LoginSignup
20
20

More than 5 years have passed since last update.

S3 Fileupload(Single/Multipart)[SDK for Java]

Posted at

はじめに

AWS SDK for Javaを使ったファイルアップロードを紹介します。
通常の同期アップロードの他、マルチパートでのアップロードがサポートされています。

マルチパートでのアップロードは、転送時にいくつかのパートに分割してアップロードすることが可能で、どれかのパートが転送失敗した場合には自動的に再送処理を行ってくれます。転送が全部終わった段階でS3はパートを組み立ててオブジェクトを作成してくれます。

準備

小さいファイルだとすぐアップロードが終わってしまうので10MBのファイルを作っておきます。私の環境はmacなのでddで作れます。

dd if=/dev/zero of=10mfile bs=1048576 count=10

ちなみにlinuxでも同じです。windowsの場合はfsutilを使うとよいでしょう。

single upload

S3SingleUpload.java
package aws.s3.upload;

import java.io.File;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.PutObjectRequest;

public class S3SingleUpload {

    public static void main(String[] args) {

        AWSCredentialsProvider provider = new ProfileCredentialsProvider("uzr");

        // s3clientインスタンスを作成
        AmazonS3 s3client = new AmazonS3Client(provider.getCredentials());

        File file = new File("/Users/yuzuru/Downloads/10mfile");
        long start = System.currentTimeMillis();

        // アップロードします。
        // PutObjectRequestの引数はバケット名、アップロード後の名前、Fileオブジェクトです。
        s3client.putObject(new PutObjectRequest("data.uzr", "10mfile",file));

        // 処理時間を取得
        long end = System.currentTimeMillis();
        long interval = end - start;
        System.out.println("処理時間:" + interval + "ミリ秒");
        System.out.println("upload finish.");
    }

}

multipart upload

マルチパートでのアップロードはListnerをセットすることで終了イベントのハンドリングや進捗状況の確認を行うことができます。

S3MultiparatUpload.java
package aws.s3.upload;

import java.io.File;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.event.ProgressEvent;
import com.amazonaws.event.ProgressEventType;
import com.amazonaws.event.ProgressListener;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.transfer.TransferManager;
import com.amazonaws.services.s3.transfer.TransferManagerConfiguration;
import com.amazonaws.services.s3.transfer.TransferProgress;
import com.amazonaws.services.s3.transfer.Upload;

public class S3MultiparatUpload {

    public static void main(String[] args) {

        AWSCredentialsProvider provider = new ProfileCredentialsProvider("uzr");

        TransferManager tm = new TransferManager(provider.getCredentials());

        File file = new File("/Users/yuzuru/Downloads/10mfile");
        long start = System.currentTimeMillis();

        Upload upload = tm.upload(new PutObjectRequest("data.uzr", "10mfile",
                file));

        // Listnerを仕込みます。
        upload.addProgressListener(new ProgressListener() {
            /**
             * 進捗状況が変わったら呼ばれるメソッド
             * ProgressEventからは、転送バイト数やパーセンテージなどが取得できます。
             * ここでは転送完了後メッセージを出すようにしています。
             */
            @Override
            public void progressChanged(ProgressEvent progressEvent) {
                if (ProgressEventType.TRANSFER_COMPLETED_EVENT == progressEvent.getEventType()) {
                    long end = System.currentTimeMillis();
                    long interval = end - start;
                    System.out.println("処理時間:" + interval + "ミリ秒");
                    System.out.println("upload finish.");                   
                }
            }
        });

    }

}

上記のコードでは紹介しませんでしたが、upload時のオプションはTransferManagerConfigurationを利用します。
こんな感じ

TransferManagerConfiguration_sample.java
        TransferManager tm = new TransferManager(provider.getCredentials());

        TransferManagerConfiguration configuration = new TransferManagerConfiguration();
        configuration.setMinimumUploadPartSize(5 * MB);
        configuration.setMultipartUploadThreshold(5 * GB);
        tm.setConfiguration(configuration);
20
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
20