マルチパートアップロードは、Alibaba Cloud SDK for Java バージョン 3.15.0 以降でのみサポートされています。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
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;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
public class Demo {
public static void main(String[] args) throws Exception {
// クラウドボックスの OSS バケットのデータエンドポイントを指定します。
String endpoint = "https://cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// クラウドボックスの OSS バケットの名前 (例: examplebucket) を指定します。
String bucketName = "examplebucket";
// クラウドボックスの OSS バケットが配置されているリージョンを指定します。
String region = "cn-hangzhou";
// CloudBox の ID を指定します。
String cloudBoxId = "cb-f8z7yvzgwfkl9q0h****";
// オブジェクトの完全なパス (例: exampledir/exampleobject.txt) を指定します。完全なパスにバケット名を含めることはできません。
String objectName = "exampledir/exampleobject.txt";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
conf.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(new DefaultCredentialProvider(credentialsProvider.getCredentials()))
.clientConfiguration(conf)
.region(region)
.cloudBoxId(cloudBoxId)
.build();
try {
// InitiateMultipartUploadRequest オブジェクトを作成します。
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
// マルチパートアップロードを初期化するときにリクエストヘッダーを設定するには、次のサンプルコードを参照してください。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// オブジェクトの Web ページのキャッシュ動作を指定します。
// metadata.setCacheControl("no-cache");
// ダウンロード時のオブジェクトの名前を指定します。
// metadata.setContentDisposition("attachment;filename=oss_MultipartUpload.txt");
// オブジェクトのコンテンツエンコード形式を指定します。
// metadata.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
// マルチパートアップを初期化するときに、同じ名前の既存のオブジェクトを上書きするかどうかを指定します。この例では、このパラメーターは true に設定され、上書きが禁止されます。
// metadata.setHeader("x-oss-forbid-overwrite", "true");
// オブジェクトの各パートのサーバー側暗号化方式を指定します。
// metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
// オブジェクトの暗号化アルゴリズムを指定します。このパラメーターを指定しない場合、AES-256 アルゴリズムが使用されます。
// metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_DATA_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
// KMS によって管理されるカスタマーマスターキー (CMK) を指定します。
// metadata.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION_KEY_ID, "9468da86-3509-4f8d-a61e-6eab1eac****");
// オブジェクトのストレージクラスを指定します。
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);
// オブジェクトに 1 つ以上のタグを指定します。
// metadata.setHeader(OSSHeaders.OSS_TAGGING, "a:1");
// request.setObjectMetadata(metadata);
// マルチパートアップロードを初期化します。
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);
// upload ID が返されます。これは、マルチパートアップロードイベントの一意の識別子です。upload ID を使用して、マルチパートアップロードのキャンセルやクエリなどの関連操作を実行できます。
String uploadId = upresult.getUploadId();
// partETags は PartETag オブジェクトのコレクションです。PartETag は、パートの ETag とパート番号で構成されます。
List<PartETag> partETags = new ArrayList<PartETag>();
// 各パートのサイズ (バイト単位)。これはパート数を計算するために使用されます。
final long partSize = 1 * 1024 * 1024L; // 1 MB。
// ローカルファイルの完全なパスを指定します。ローカルパスを指定しない場合、ファイルはサンプルプログラムが属するプロジェクトのパスからアップロードされます。
final File sampleFile = new File("D:\\localpath\\examplefile.txt");
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());
}
// CompleteMultipartUploadRequest オブジェクトを作成します。
// マルチパートアップロードを完了するときは、すべての有効な partETag を指定する必要があります。OSS が partETag を受信すると、各パートを検証します。すべてのパートが検証されると、OSS はそれらを完全なオブジェクトに結合します。
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
// マルチパートアップロードを完了するときにオブジェクトのアクセス権限を設定するには、次のサンプルコードを参照してください。
// completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.Private);
// 現在の upload ID でアップロードされたすべてのパートをリストするかどうかを指定します。サーバー上のパートをリストして完全なオブジェクトにマージする場合、CompleteMultipartUploadRequest の partETags は null にすることができます。
// Map<String, String> headers = new HashMap<String, String>();
// x-oss-complete-all を yes に設定すると、OSS は現在の upload ID でアップロードされたすべてのパートをリストし、パート番号でソートしてから、マルチパートアップロードを完了します。
// x-oss-complete-all を yes に設定した場合、本文を指定することはできません。指定すると、エラーが報告されます。
// headers.put("x-oss-complete-all","yes");
// completeMultipartUploadRequest.setHeaders(headers);
// マルチパートアップロードを完了します。
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
System.out.println(completeMultipartUploadResult.getETag());
} 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();
}
}
}
}