ネットワークが不安定であるかプログラムが異常終了し、オブジェクト全体を再度ダウンロードする必要があるため、大きなサイズのオブジェクトをダウンロードできない可能性があります。 ただし、オブジェクトは複数回試行してもダウンロードに失敗することがあります。 したがって、OSS は再開可能なダウンロードを提供します。

再開可能ダウンロードを有効にするには、ダウンロードするオブジェクトを複数のパーツに分割して別々にダウンロードする必要があります。 すべてのパーツをダウンロードした後に、これらのパーツは完全なオブジェクトに結合されます。

現在のダウンロードの進行状況はチェックポイントファイルに記録されます。 あるパーツがダウンロードに失敗した場合、次のダウンロードはチェックポイントファイルに記録された進行状況に基づいてそのパーツから始まり、再開可能なダウンロードを実現します。 オブジェクトがダウンロードされた後、チェックポイントファイルは削除されます。

  • OSS SDK はダウンロードの進行状況をチェックポイントファイルに記録します。 したがって、プログラムにチェックポイントファイルへの書き込み権限があることを確認してください。 検証情報が含まれているため、チェックポイントファイルを変更しないでください。 オブジェクトのチェックポイントファイルが破損している場合は、オブジェクト全体が再度ダウンロードされます。
  • ダウンロード中にダウンロード中のオブジェクトが変更された (オブジェクトのタグが変更された)、またはパーツファイルが見つからないか変更された場合、オブジェクト全体が再度ダウンロードされます。

再開可能なダウンロードを有効にするために、Bucket.DownloadFile を使うことができます。 DownloadFileRequest には、以下のパラメーターが含まれています。

パラメーター 説明
objectKey ダウンロードするオブジェクトの名前を指定します。
filePath オブジェクトをダウンロードするローカルファイルのパスを指定します。
partSize パーツのサイズを指定します。 値は 1 バイトから 5 GB までです。
options 以下のダウンロードオプションを指定します。
  • ルーチン: 同時にダウンロードする必要があるパーツの番号を指定します。 既定値は 1 です。
  • チェックポイント: 再開可能アップロードを有効にするかどうかを指定し、チェックポイントファイルを構成します。 再開可能アップロードは既定では無効になっています。 たとえば、oss.Checkpoint(true, "") は再開可能ダウンロードが有効であり、チェックポイントファイルが file.cp であることを示します。ここで、file はローカルファイルの名前です。 チェックポイントファイルは、ローカルファイルがあるディレクトリにあります。 チェックポイントファイルを指定するには、oss.Checkpoint(true, "your-cp-file.cp")を使用できます。
  • ダウンロードの条件を設定したい場合は、「条件付きダウンロード」をご参照ください。

再開可能ダウンロードのため、次のコードを実行します。

package main

import (
	"fmt"
	"os"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// Create an OSSClient instance.
	client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Obtain the bucket.
	bucket, err := client.Bucket("<yourBucketName>")
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// Start the resumable download. Three parts are downloaded simultaneously.
	// <yourObjectName>" is the objectKey, "LocalFile" is the filePath, and 100*1024 is the partSize.
	err = bucket.DownloadFile("<yourObjectName>", "LocalFile", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
	if err ! = nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
}