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

ApsaraVideo VOD:ApsaraVideo VOD API を呼び出してメディアファイルをアップロードする

最終更新日:Feb 11, 2026

ApsaraVideo VOD を使用して音声・動画などのメディアファイルを処理するには、まずこれらのファイルを ApsaraVideo VOD にアップロードする必要があります。その後、トランスコード、審査、ウォーターマークの追加などの操作を実行できます。本トピックでは、API を呼び出してメディアファイルをアップロードする方法について説明し、完全なデモコードを提供します。

背景情報

ApsaraVideo VOD API を使用したメディアファイルのアップロードは、ネイティブの OSS SDK に依存しています。開発者は、ApsaraVideo VOD からアップロード用 URL および認証情報を取得し、Base64 デコードを実行した後、OSS を使用してアップロードを完了するという一連のアップロードロジック全体を実装する責任があります。このアプローチは複雑であり、エラーが発生しやすくなっています。本トピックでは、メディア資産が アップロード中 状態で停止してしまう問題を回避するための、完全な API ベースのアップロードデモを提供します。

説明
  • ApsaraVideo VOD API を使用したメディアファイルのアップロードは、OSS を基盤とするアップロード方式です。詳細については、「概要」をご参照ください。

  • 本トピックでは Java のサンプルコードを提供します。その他の言語のサンプルコードについては、「OSS SDK を使用したメディアファイルのアップロード」をご参照ください。

  • その他のご質問やご意見がある場合は、技術サポートのために DingTalk グループ 11370001915 にご参加ください。

事前準備

ステップ 1: ApsaraVideo VOD SDK のインストール

詳細については、「インストール」をご参照ください。

ステップ 2: OSS SDK のインストール

詳細については、「Java 向け OSS SDK のインストール」をご参照ください。

ステップ 3: アップロードを開始する

以下のセクションでは、ローカルのメディアファイルのアップロード、URL を基にしたネットワークストリームのアップロード、ローカルの m3u8 ファイルのアップロード、マルチパートアップロード、再開可能なアップロードの各操作に対応するサンプルコードを示します。アップロード用 URL および認証情報を取得し、Base64 エンコードされたアップロード用 URL および認証情報をデコードするサンプルコードについては、本トピックの「サンプルコード」セクションをご参照ください。

ローカル PC からのファイルアップロード

public static void uploadLocalFile(OSSClient ossClient, JSONObject uploadAddress, String localFile) {
        String bucketName = uploadAddress.getString("Bucket");
        String objectName = uploadAddress.getString("FileName");

        try {
            File file = new File(localFile);
            PutObjectResult result = ossClient.putObject(bucketName, objectName, file);
            // アップロードが成功した場合、HTTP ステータスコード 200 が返されます。 
            // アップロード中のプログレスバーのパラメーターを設定します。UploadOss は、ローカルファイルをアップロードするために呼び出されるクラスの名前を指定します。実際の使用時には、UploadOss を呼び出すクラス名に置き換えてください。 
//            PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName,objectName, file).
//                    <PutObjectRequest>withProgressListener(new UploadOss()));
//            System.out.println(result.getResponse().getStatusCode());
        } 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 (Throwable 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 {
            // OSSClient インスタンスをシャットダウンします。 
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

URL を基にしたネットワークストリームのアップロード

public static void uploadURLFile(OSSClient ossClient, JSONObject uploadAddress, String url) {
    String bucketName = uploadAddress.getString("Bucket");
    String objectName = uploadAddress.getString("FileName");

    try {
        InputStream inputStream = new URL(url).openStream();
        PutObjectResult result = ossClient.putObject(bucketName, objectName, inputStream);
        // アップロードが成功した場合、HTTP ステータスコード 200 が返されます。 
        System.out.println(result.getResponse().getStatusCode());
    } 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 (Throwable 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 {
        // OSSClient インスタンスをシャットダウンします。 
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
}

ローカルの m3u8 ファイルのアップロード

説明

ローカルの m3u8 ファイル(パートファイルを含む)をアップロードするには、m3u8 インデックスファイルの URL およびパート URL を指定する必要があります。

public static void uploadLocalM3U8(OSSClient ossClient, JSONObject uploadAddress, String indexFile, String[] tsFiles ) {

        String bucketName = uploadAddress.getString("Bucket");
        String objectName = uploadAddress.getString("FileName");
        String objectPrefix = uploadAddress.getString("ObjectPrefix");
        System.out.println(uploadAddress.toJSONString());

        try {
            // インデックスファイルをアップロードします。
            File index = new File(indexFile);
            ossClient.putObject(bucketName, objectName, index);
            Thread.sleep(200);
            // TS ファイルをアップロードします。
            for(String filePath : tsFiles){
                File ts = new File(filePath);
                ossClient.putObject(bucketName, objectPrefix + ts.getName(), ts);
                Thread.sleep(200);
            }
        } 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 (Throwable 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 {
            // OSSClient インスタンスをシャットダウンします。 
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

マルチパートアップロードおよび再開可能なアップロードの実行

public static void uploadEnableCheckPointFile(OSSClient ossClient, JSONObject uploadAddress, String localFile) {
    String bucketName = uploadAddress.getString("Bucket");
    String objectName = uploadAddress.getString("FileName");

    try {
        UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName,objectName);
        // UploadFileRequest を使用してパラメーターを設定します。 
        // アップロードするローカルファイルの完全なパスを指定します。例:D:\\localpath\\examplefile.mp4。デフォルトでは、完全なパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 
        uploadFileRequest.setUploadFile(localFile);
        // アップロードタスクの同時実行スレッド数を指定します。デフォルト値:1。 
        uploadFileRequest.setTaskNum(5);
        // 各パートのサイズを指定します。単位:バイト。有効範囲:100 KB ~ 5 GB。デフォルト値:100 KB。 
        uploadFileRequest.setPartSize(1 * 1024 * 1024);
        // 再開可能なアップロードを有効にするかどうかを指定します。デフォルトでは無効です。 
        uploadFileRequest.setEnableCheckpoint(true);
        // 各パートのアップロード結果を記録するファイルを指定します。このチェックポイントファイルにはアップロードの進捗情報が保存されます。パートのアップロードに失敗した場合、チェックポイントファイルに記録された進捗に基づいてタスクを継続できます。ローカルファイルのアップロードが完了すると、チェックポイントファイルは削除されます。 
        // デフォルトでは、このパラメーターを指定しない場合、チェックポイントファイルはアップロード対象のファイルと同じディレクトリに保存され、${uploadFile}.ucp という名前になります。 
        //uploadFileRequest.setCheckpointFile("yourCheckpointFile");
        // 再開可能なアップロードを開始します。 
        ossClient.uploadFile(uploadFileRequest);

    } 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 (Throwable 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 {
        // OSSClient インスタンスをシャットダウンします。 
        if (ossClient != null) {
            ossClient.shutdown();
        }
    }
}

サンプルコード

import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.event.ProgressEvent;
import com.aliyun.oss.event.ProgressEventType;
import com.aliyun.oss.event.ProgressListener;
import com.aliyun.oss.model.*;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.*;
import org.apache.commons.codec.binary.Base64;

import java.io.File;
import java.io.InputStream;
import java.net.URL;

/**
 * *****   使用上の注意事項     ******!  ! 
 * 以下のサンプルコードは、Java で API 操作を呼び出して ApsaraVideo VOD にメディアファイルをアップロードする方法の例を示しています。OSS SDK for Java を使用したメディアファイルのアップロード方法については、https://www.alibabacloud.com/help/object-storage-service/latest/overview-3 をご参照ください。
 * このデモはアップロード SDK として使用できません。アップロード SDK の使用方法については、https://www.alibabacloud.com/help/apsaravideo-for-vod/latest/upload-sdk-overview をご参照ください。
 * <p>
 * 1. 標準的な音声および動画ファイルのアップロード
 *
 * 1.1 ローカルファイルのアップロード。マルチパートアップロードを使用してローカルファイルをアップロードできます。再開可能なアップロードもサポートされています。 
 * 1.1.1 再開可能なアップロードが無効な場合、アップロードタスクの実行可能時間の最大値は 3,000 秒です。アップロード可能なファイルの最大サイズは、ネットワーク帯域幅およびディスクの読み取り/書き込み能力によって異なります。詳細については、uploadEnableCheckPointFile 関数の説明をご参照ください。 
 * 1.1.2 再開可能なアップロードを有効化すると、最大 48.8 TB のファイルをアップロードできます。再開可能なアップロード中、ApsaraVideo VOD はアップロード進捗をローカルディスクファイルに書き込みます。これにより、アップロード速度に影響が出ます。ファイルサイズに応じて、再開可能なアップロード機能を有効化することを検討してください。
 *
 * 1.2 ネットワークストリームのアップロード。アップロード用 URL を指定してネットワークストリームをアップロードできます。最大 48.8 TB のファイルをアップロードできます。詳細については、uploadURLFile 関数の説明をご参照ください。 
 *
 * 1.3 ファイルストリームのアップロード。特定のローカルファイルをアップロードできます。ファイルストリームのアップロードでは再開可能なアップロード機能はサポートされていません。最大 5 GB のファイルをアップロードできます。詳細については、uploadLocalFile 関数の説明をご参照ください。 
 *
 * <p>
 * 2. m3u8 ファイルのアップロード
 * 2.1. m3u8 形式のローカル音声および動画ファイルを ApsaraVideo VOD にアップロードします。m3u8 インデックスファイルの URL およびパート URL をアップロードする必要があります。詳細については、uploadLocalM3U8 関数の説明をご参照ください。
 * 2.2. オンラインの m3u8 音声および動画ファイルのアップロード。オンラインの m3u8 音声および動画ファイルのアップロードには、URL を使用することを推奨します。 
 *
 * 注意:
 * オンラインの m3u8 音声および動画ファイルを URL を使用してアップロードする場合、URL がアクセス可能であることを確認してください。メディアファイルへのアクセスを制限したい場合は、署名情報を含む URL を指定し、URL の有効期間が十分であることを確認してください。これにより、URL がアクセス不能になることによるアップロード失敗を防止できます。
 * <p>
 *
 * 3. アップロード進捗の監視
 * 3.1 デフォルトのコールバック関数を使用してアップロード進捗を監視します。デフォルトのコールバック関数を使用するには、ProgressListener クラスを呼び出す必要があります。詳細については、https://www.alibabacloud.com/help/object-storage-service/latest/upload-progress-bars-4 をご参照ください。
 * 3.2 カスタムコールバック関数を使用してアップロード進捗を監視します。カスタムコールバック関数を使用すると、さまざまなイベントを処理するためのメソッドを、ニーズに応じて指定できます。 
 * 3.3 カスタムコールバック関数の使用方法については、サンプルコードの 225 行目をご参照ください。
 *
 * <p>
 *
 * 4. API 操作の呼び出し
 * 4.1 必要に応じて、CreateUploadVideo または RefreshUploadVideo 操作を呼び出してアップロード認証情報を取得できます。
 * 4.2 RefreshUploadVideo を呼び出して、有効期限が切れた後にアップロード認証情報を更新できます。また、videoId を使用してアップロード済みのメディアファイルを上書きすることもできます。
 * 4.3 CreateUploadImage 操作を呼び出して、イメージのアップロード認証情報を取得できます。
 * 4.4 CreateUploadAttachedMedia 操作を呼び出して、補助メディアアセットのアップロード認証情報を取得できます。
 * 4.5 API 操作の詳細については、https://www.alibabacloud.com/help/apsaravideo-for-vod/latest/api-doc-vod-2017-03-21-api-overview をご参照ください。
 *
 * <p>
 *
 * 注意:
 * サンプルコードで必要なパラメーターを指定し、不要な任意のパラメーターは削除してください。これにより、無効なパラメーター値によるエラーを防止できます。 
 */
public class UploadVodByApiDemo implements ProgressListener {

    // 任意。アップロードプログレスバーに関連するパラメーターを指定します。
    private long bytesWritten = 0;
    private long totalBytes = -1;
    private boolean succeed = false;

    public static void main(String[] argv) {
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持ちます。API 操作の呼び出しまたは日常的な運用管理(O&M)には、RAM ユーザーの使用を推奨します。 
        // AccessKey ペア(AccessKey ID および AccessKey Secret)をプロジェクトコード内に保存しないことを推奨します。そうしないと、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが損なわれる可能性があります。 
        // 本サンプルでは、ApsaraVideo VOD が環境変数から AccessKey ペアを読み取ることで、API アクセスの認証を実装しています。サンプルコードを実行する前に、環境変数 ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET を設定してください。 
        String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        // ApsaraVideo VOD にアップロードするローカル動画ファイルの完全なパスを指定します。パスには必ずファイル名拡張子を含めてください。
        String localFile = "E:/demo/demo.mp4";
        // ネットワークストリームのアドレスを指定します。URL はアクセス可能である必要があります。
        String url = "https://bucket-name*****.oss-cn-shanghai.aliyuncs.com/demo/demo.mp4";

        try {
            // ApsaraVideo VOD クライアントを初期化し、アップロード用 URL およびアップロード認証情報を取得します。
            DefaultAcsClient vodClient = initVodClient(accessKeyId, accessKeySecret);

            // 動画のアップロード認証情報を取得します。
            CreateUploadVideoResponse createUploadVideoResponse = createUploadVideo(vodClient);
            // アップロード認証情報を更新します。
            //RefreshUploadVideoResponse refreshUploadVideoResponse = refreshUploadVideo(vodClient);
            // イメージのアップロード認証情報を取得します。
            //CreateUploadImageResponse createUploadImageResponse = createUploadImage(vodClient);
            // 補助メディアアセットのアップロード認証情報を取得します。
            //CreateUploadAttachedMediaResponse createUploadAttachedMediaResponse = createUploadAttachedMedia(vodClient);

            // 上記のコードが正常に実行された場合、videoId、uploadAddress、および uploadAuth パラメーターが返されます。
            String videoId = createUploadVideoResponse.getVideoId();
            JSONObject uploadAuth = JSONObject.parseObject(decodeBase64(createUploadVideoResponse.getUploadAuth()));
            JSONObject uploadAddress = JSONObject.parseObject(decodeBase64(createUploadVideoResponse.getUploadAddress()));

            // デコードされたアップロード用 URL およびアップロード認証情報を使用して OSS クライアントを初期化します。
           // OSS クライアントで uploadAuth および uploadAddress を指定することで、動画ファイルを OSS にアップロードできます。
            OSSClient ossClient = initOssClient(uploadAuth, uploadAddress);

            // 必要に応じてアップロード方法を指定します。
            // 1. ローカルファイルのアップロード。注意:複数のパートが同期的にアップロードされるため、待ち時間が長くなる可能性があります。所要時間はファイルサイズおよびアップストリーム帯域幅に依存します。
            uploadLocalFile(ossClient, uploadAddress, localFile);
            // 2. オンラインファイルのアップロード。
            //uploadURLFile(ossClient, uploadAddress, url);
            // 3. マルチパートアップロードおよび再開可能なアップロード。
            //uploadEnableCheckPointFile(ossClient, uploadAddress, localFile);
            // 4. m3u8 ファイルのアップロード。
            //String indexFile = "E:/demo/demo.m3u8";
            //String[] tsFiles = {"E:/demo/demo_01.ts"};
            //uploadLocalM3U8(ossClient, uploadAddress, indexFile, tsFiles);

            System.out.println("ローカルファイルのアップロードに成功しました。VideoId : " + videoId);
        } catch (Exception e) {
            System.out.println("ローカルファイルのアップロードに失敗しました。エラーメッセージ : " + e.getLocalizedMessage());
        }
    }

    /**
     * ApsaraVideo VOD クライアントの初期化。
     * @throws ClientException
     */
    public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
        // ApsaraVideo VOD のアクティベーションリージョンを指定します。中国本土で ApsaraVideo VOD をアクティベートしている場合は、cn-shanghai を指定します。その他のサポートされているリージョンについては、https://www.alibabacloud.com/help/apsaravideo-for-vod/latest/vod-centers-and-endpoints をご参照ください。
        String regionId = "cn-shanghai";
        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
        DefaultAcsClient client = new DefaultAcsClient(profile);
        return client;
    }

    /**
     * OSS クライアントの初期化。
     * @throws ClientException
     */
    public static OSSClient initOssClient(JSONObject uploadAuth, JSONObject uploadAddress) {
        String endpoint = uploadAddress.getString("Endpoint");
        String accessKeyId = uploadAuth.getString("AccessKeyId");
        String accessKeySecret = uploadAuth.getString("AccessKeySecret");
        String securityToken = uploadAuth.getString("SecurityToken");
        return new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
    }

    /**
     * アップロード認証情報の取得。
     * @throws ClientException
     */
    public static CreateUploadVideoResponse createUploadVideo(DefaultAcsClient vodClient) throws ClientException {
        CreateUploadVideoRequest request = new CreateUploadVideoRequest();
        request.setFileName("vod_test.m3u8");
        request.setTitle("this is title");
        //request.setDescription("this is desc");
        //request.setTags("tag1,tag2");
        //request.setCoverURL("http://vod.****.com/test_cover_url.jpg");
        //request.setCateId(-1L);
        //request.setTemplateGroupId("34f055******c7af499c73");
        //request.setWorkflowId("");
        //request.setStorageLocation("");
        //request.setAppId("app-1000000");

        return vodClient.getAcsResponse(request);
    }

    /**
     * アップロード認証情報の更新。
     * @throws ClientException
     */
    public static RefreshUploadVideoResponse refreshUploadVideo(DefaultAcsClient vodClient) throws ClientException {
        RefreshUploadVideoRequest request = new RefreshUploadVideoRequest();
        request.setAcceptFormat(FormatType.JSON);
        request.setVideoId("VideoId");

        // リクエストタイムアウト期間を設定します。
        request.setSysReadTimeout(1000);
        request.setSysConnectTimeout(1000);

        return vodClient.getAcsResponse(request);
    }

    /**
     * イメージのアップロード認証情報の取得。
     * @throws ClientException
     */
    public static CreateUploadImageResponse createUploadImage(DefaultAcsClient vodClient) throws ClientException {
        CreateUploadImageRequest request = new CreateUploadImageRequest();
        request.setImageType("default");
        request.setAcceptFormat(FormatType.JSON);

        // リクエストタイムアウト期間を設定します。
        request.setSysReadTimeout(1000);
        request.setSysConnectTimeout(1000);

        return vodClient.getAcsResponse(request);
    }

    /**
     * 補助メディアアセットのアップロード認証情報の取得。
     * @throws ClientException
     */
    public static CreateUploadAttachedMediaResponse createUploadAttachedMedia(DefaultAcsClient vodClient) throws ClientException {
        CreateUploadAttachedMediaRequest request = new CreateUploadAttachedMediaRequest();
        request.setBusinessType("watermark");
        request.setMediaExt("png");
        request.setAcceptFormat(FormatType.JSON);

        // リクエストタイムアウト期間を設定します。
        request.setSysReadTimeout(1000);
        request.setSysConnectTimeout(1000);

        return vodClient.getAcsResponse(request);
    }

    /**
     *  ローカルファイルのアップロード。
     * @throws Exception
     */
    public static void uploadLocalFile(OSSClient ossClient, JSONObject uploadAddress, String localFile) {
        String bucketName = uploadAddress.getString("Bucket");
        String objectName = uploadAddress.getString("FileName");

        try {
            File file = new File(localFile);
            PutObjectResult result = ossClient.putObject(bucketName, objectName, file);
            // アップロードが成功した場合、HTTP ステータスコード 200 が返されます。 
            // アップロード中のプログレスバーのパラメーターを設定します。UploadOss は、ローカルファイルをアップロードするために呼び出されるクラスの名前を指定します。実際の使用時には、UploadOss を呼び出すクラス名に置き換えてください。 
//            PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName,objectName, file).
//                    <PutObjectRequest>withProgressListener(new UploadOss()));
//            System.out.println(result.getResponse().getStatusCode());
        } 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 (Throwable 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 {
            // OSSClient インスタンスをシャットダウンします。 
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     *  ネットワークストリームのアップロード。
     * @throws Exception
     */
    public static void uploadURLFile(OSSClient ossClient, JSONObject uploadAddress, String url) {
        String bucketName = uploadAddress.getString("Bucket");
        String objectName = uploadAddress.getString("FileName");

        try {
            InputStream inputStream = new URL(url).openStream();
            PutObjectResult result = ossClient.putObject(bucketName, objectName, inputStream);
            // アップロードが成功した場合、HTTP ステータスコード 200 が返されます。 
            System.out.println(result.getResponse().getStatusCode());
        } 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 (Throwable 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 {
            // OSSClient インスタンスをシャットダウンします。 
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     *  再開可能なアップロードの開始。
     * @throws Exception
     */
    public static void uploadEnableCheckPointFile(OSSClient ossClient, JSONObject uploadAddress, String localFile) {
        String bucketName = uploadAddress.getString("Bucket");
        String objectName = uploadAddress.getString("FileName");

        try {
            UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName,objectName);
            // UploadFileRequest を使用してパラメーターを設定します。 
            // アップロードするローカルファイルの完全なパスを指定します。例:D:\\localpath\\examplefile.mp4。デフォルトでは、完全なパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 
            uploadFileRequest.setUploadFile(localFile);
            // アップロードタスクの同時実行スレッド数を指定します。デフォルト値:1。 
            uploadFileRequest.setTaskNum(5);
            // 各パートのサイズを指定します。単位:バイト。有効範囲:100 KB ~ 5 GB。デフォルト値:100 KB。 
            uploadFileRequest.setPartSize(1 * 1024 * 1024);
            // 再開可能なアップロードを有効にするかどうかを指定します。デフォルトでは無効です。 
            uploadFileRequest.setEnableCheckpoint(true);
            // 各パートのアップロード結果を記録するファイルを指定します。このチェックポイントファイルにはアップロードの進捗情報が保存されます。パートのアップロードに失敗した場合、チェックポイントファイルに記録された進捗に基づいてタスクを継続できます。ローカルファイルのアップロードが完了すると、チェックポイントファイルは削除されます。 
            // デフォルトでは、このパラメーターを指定しない場合、チェックポイントファイルはアップロード対象のファイルと同じディレクトリに保存され、${uploadFile}.ucp という名前になります。 
            //uploadFileRequest.setCheckpointFile("yourCheckpointFile");
            // 再開可能なアップロードを開始します。 
            ossClient.uploadFile(uploadFileRequest);

        } 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 (Throwable 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 {
            // OSSClient インスタンスをシャットダウンします。 
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     *  ローカルの m3u8 メディアファイルのアップロード。
     * @throws Exception
     */
    public static void uploadLocalM3U8(OSSClient ossClient, JSONObject uploadAddress, String indexFile, String[] tsFiles ) {

        String bucketName = uploadAddress.getString("Bucket");
        String objectName = uploadAddress.getString("FileName");
        String objectPrefix = uploadAddress.getString("ObjectPrefix");
        System.out.println(uploadAddress.toJSONString());

        try {
            // インデックスファイルをアップロードします。
            File index = new File(indexFile);
            ossClient.putObject(bucketName, objectName, index);
            Thread.sleep(200);
            // TS ファイルをアップロードします。
            for(String filePath : tsFiles){
                File ts = new File(filePath);
                ossClient.putObject(bucketName, objectPrefix + ts.getName(), ts);
                Thread.sleep(200);
            }
        } 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 (Throwable 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 {
            // OSSClient インスタンスをシャットダウンします。 
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    // プログレスバーを使用するには、コールバックメソッドを再定義する必要があります。以下のサンプルコードは参考例です。
    @Override
    public void progressChanged(ProgressEvent progressEvent) {
        long bytes = progressEvent.getBytes();
        ProgressEventType eventType = progressEvent.getEventType();
        switch (eventType) {
            case TRANSFER_STARTED_EVENT:
                System.out.println("アップロードを開始しています......");
                break;
            case REQUEST_CONTENT_LENGTH_EVENT:
                this.totalBytes = bytes;
                System.out.println(this.totalBytes + " バイトが OSS にアップロードされます");
                break;
            case REQUEST_BYTE_TRANSFER_EVENT:
                this.bytesWritten += bytes;
                if (this.totalBytes != -1) {
                    int percent = (int)(this.bytesWritten * 100.0 / this.totalBytes);
                    System.out.println(bytes + " バイトがこの時点で書き込まれました。アップロード進捗: " + percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")");
                } else {
                    System.out.println(bytes + " バイトがこの時点で書き込まれました。アップロード比率:不明" + "(" + this.bytesWritten + "/...)");
                }
                break;
            case TRANSFER_COMPLETED_EVENT:
                this.succeed = true;
                System.out.println("アップロードに成功しました。合計 " + this.bytesWritten + " バイトが転送されました");
                break;
            case TRANSFER_FAILED_EVENT:
                System.out.println("アップロードに失敗しました。" + this.bytesWritten + " バイトが転送されました");
                break;
            default:
                break;
        }
    }

    public static String decodeBase64(String s) {
        byte[] b = null;
        String result = null;
        if (s != null) {
            Base64 decoder = new Base64();
            try {
                b = decoder.decode(s);
                result = new String(b, "utf-8");
            } catch (Exception e) {
            }
        }
        return result;
    }
}