このトピックでは、バージョン管理が有効なバケットにファイル (オブジェクト) をアップロードする方法について説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスするには、内部エンドポイントを使用します。サポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「一般的なシナリオの設定例」をご参照ください。
ファイルをアップロードするには、
oss:PutObject権限が必要です。詳細については、「RAM ユーザーへのカスタムアクセスポリシーの付与」をご参照ください。
シンプルアップロード
バージョン管理が有効なバケットでは、OSS は新しいオブジェクトごとに一意のバージョン ID を自動的に生成します。この ID は、レスポンスヘッダーの x-oss-version-id フィールドで返されます。バージョン管理が一時停止されているバケットでは、新しいオブジェクトのバージョン ID は "null" になります。同じ名前のオブジェクトをアップロードすると、新しいオブジェクトが前のオブジェクトを上書きします。OSS は、"null" のバージョン ID を持つオブジェクトのバージョンが 1 つだけであることを保証します。
次のコードは、シンプルアップロードを実行する方法を示しています。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// 中国 (杭州) リージョンのエンドポイントを例として使用します。実際のエンドポイントに置き換えてください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケット名を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。
String objectName = "exampledir/object";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 次の例は、文字列をアップロードする方法を示しています。
String content = "Hello OSS";
PutObjectResult result = ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
// アップロードされたオブジェクトのバージョン ID を表示します。
System.out.println("result.versionid: " + result.getVersionId());
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}追加アップロード
バージョン管理が有効なバケットでは、AppendObject 操作を呼び出すことによって、追加可能オブジェクトの現在のバージョンにのみデータを追加できます。追加可能オブジェクトの以前のバージョンにデータを追加することはできません。
追加可能オブジェクトの現在のバージョンで AppendObject 操作を呼び出しても、OSS はオブジェクトの以前のバージョンを作成しません。
追加可能オブジェクトの現在のバージョンで PutObject または DeleteObject 操作を呼び出すと、OSS は追加可能オブジェクトを以前のバージョンとして保存します。このオブジェクトにデータを追加することはできなくなります。
通常のオブジェクトや削除マーカーなど、追加不可能なオブジェクトの現在のバージョンで AppendObject 操作を呼び出すことはできません。
次のコードは、追加アップロードを実行する方法を示しています。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// 中国 (杭州) リージョンのエンドポイントを例として使用します。実際のエンドポイントに置き換えてください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケット名を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。
String objectName = "exampledir/object";
String content1 = "Hello OSS A \n";
String content2 = "Hello OSS B \n";
String content3 = "Hello OSS C \n";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
ObjectMetadata meta = new ObjectMetadata();
// アップロードするコンテンツのコンテンツタイプを指定します。
meta.setContentType("text/plain");
// AppendObjectRequest を使用して複数のパラメーターを設定します。
AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, objectName, new ByteArrayInputStream(content1.getBytes()),meta);
// AppendObjectRequest を使用して単一のパラメーターを設定します。
// バケット名を設定します。
//appendObjectRequest.setBucketName("<yourBucketName>");
// ファイル名を設定します。
//appendObjectRequest.setKey("<yourObjectName>");
// 追加するコンテンツを設定します。InputStream または File を使用できます。この例では InputStream を使用します。
//appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
// 追加するコンテンツを設定します。InputStream または File を使用できます。この例では File を使用します。
//appendObjectRequest.setFile(new File("<yourLocalFile>"));
// ファイルのメタデータを指定します。これは最初の追加操作でのみ有効です。
//appendObjectRequest.setMetadata(meta);
// 最初の追加操作。
// データの追加を開始する位置を設定します。
appendObjectRequest.setPosition(0L);
AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
// ファイルの 64 ビット CRC 値。
System.out.println(appendObjectResult.getObjectCRC());
// 2 番目の追加操作。
// nextPosition は、次の追加操作の位置を指定します。これはファイルの現在の長さです。
appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
appendObjectResult = ossClient.appendObject(appendObjectRequest);
// 3 番目の追加操作。
appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes()));
appendObjectResult = ossClient.appendObject(appendObjectRequest);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}マルチパートアップロード
バージョン管理が有効なバケットでは、CompleteMultipartUpload 操作を呼び出してマルチパートアップロードを完了できます。OSS はファイル全体に対して一意のバージョン ID を生成します。この ID は、レスポンスヘッダーの x-oss-version-id フィールドで返されます。
次のコードは、マルチパートアップロードを実行する方法を示しています。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) throws Exception {
// 中国 (杭州) リージョンのエンドポイントを例として使用します。実際のエンドポイントに置き換えてください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケット名を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。
String objectName = "exampledir/object";
String localFile = "D://example.txt";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
/* ステップ 1: マルチパートアップロードイベントを初期化します。
*/
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
// アップロード ID が返されます。これはマルチパートアップロードイベントの一意の識別子です。このアップロード ID を使用して、マルチパートアップロードのキャンセルやクエリなどの操作を実行できます。
String uploadId = upresult.getUploadId();
/* ステップ 2: パートをアップロードします。
*/
// partETags は PartETag オブジェクトのコレクションです。PartETag は、パートの ETag とパート番号で構成されます。
List<PartETag> partETags = new ArrayList<PartETag>();
// パート数を計算します。
final long partSize = 1 * 1024 * 1024L; // 1 MB
final File sampleFile = new File(localFile);
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize != 0) {
partCount++;
}
// パートを走査してアップロードします。
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
InputStream instream = new FileInputStream(sampleFile);
// アップロード済みのパートをスキップします。
instream.skip(startPos);
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setKey(objectName);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setInputStream(instream);
// パートサイズを設定します。最後のパートを除き、各パートの最小サイズは 100 KB です。
uploadPartRequest.setPartSize(curPartSize);
// パート番号を設定します。アップロードされる各パートには 1 から 10,000 までのパート番号があります。パート番号がこの範囲外の場合、OSS は InvalidArgument エラーコードを返します。
uploadPartRequest.setPartNumber( i + 1);
// パートは順番にアップロードする必要はありません。異なるクライアントからアップロードすることも可能です。OSS はパート番号に基づいてパートを結合し、完全なファイルを作成します。
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
// 各パートがアップロードされると、OSS からのレスポンスに PartETag が含まれます。PartETag は partETags に保存されます。
partETags.add(uploadPartResult.getPartETag());
}
/* ステップ 3: マルチパートアップロードを完了します。
*/
// この操作を実行するときは、すべての有効な partETag を提供する必要があります。OSS は送信された partETag を受信した後、各パートの有効性を検証します。すべてのパートが検証されると、OSS はそれらを結合して完全なファイルを作成します。
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
// アップロードされたファイルのバージョン ID を表示します。
System.out.println("restore object versionid: " + completeMultipartUploadResult.getVersionId());
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}関連ドキュメント
シンプルアップロードの詳細については、「PutObject」をご参照ください。
追加アップロードの詳細については、「AppendObject」をご参照ください。
マルチパートアップロードの詳細については、「CompleteMultipartUpload」をご参照ください。