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

# はじめに

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);
```