すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:ファイルのアップロード (Java SDK V1)

最終更新日:Nov 26, 2025

このトピックでは、バージョン管理が有効なバケットにファイル (オブジェクト) をアップロードする方法について説明します。

注意事項

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。同じリージョン内の他の 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」をご参照ください。