プログレスバーは、アップロードまたはダウンロードの進行状況を示します。 このトピックでは、Bucket.GetObjectToFile メソッドを例として、ファイル (オブジェクト) をダウンロードする際にプログレスバーを出力する方法を説明します。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。 OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得します。 アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。 カスタムドメイン名またはセキュリティトークンサービス (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。
サンプルコード
次のコードは、examplebucket バケットから exampleobject.txt ファイルをダウンロードする際にプログレスバーを出力する方法を示しています。
package main
import (
"fmt"
"os"
"sync/atomic"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// プログレスバーリスナーを定義します。
type OssProgressListener struct {
lastProgress int64
}
// 進行状況変更イベントのハンドラを定義します。
func (listener *OssProgressListener) ProgressChanged(event *oss.ProgressEvent) {
switch event.EventType {
case oss.TransferStartedEvent:
fmt.Printf("Transfer Started, ConsumedBytes: %d, TotalBytes %d.\n",
event.ConsumedBytes, event.TotalBytes)
case oss.TransferDataEvent:
if event.TotalBytes != 0 {
progress := int64(event.ConsumedBytes * 100 / event.TotalBytes)
if progress != atomic.LoadInt64(&listener.lastProgress) {
atomic.StoreInt64(&listener.lastProgress, progress)
fmt.Printf("\rTransfer Data, ConsumedBytes: %d, TotalBytes %d, %d%%.\n",
event.ConsumedBytes, event.TotalBytes, progress)
}
}
case oss.TransferCompletedEvent:
fmt.Printf("\nTransfer Completed, ConsumedBytes: %d, TotalBytes %d.\n",
event.ConsumedBytes, event.TotalBytes)
case oss.TransferFailedEvent:
fmt.Printf("\nTransfer Failed, ConsumedBytes: %d, TotalBytes %d.\n",
event.ConsumedBytes, event.TotalBytes)
default:
}
}
func main() {
// 環境変数からアクセス認証情報を取得します。 このコードを実行する前に、環境変数 OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに置き換えます。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 他のリージョンでは、実際のエンドポイントを使用してください。
// yourRegion をバケットが配置されているリージョンに置き換えます。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 他のリージョンでは、実際のリージョンを使用してください。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケット名を指定します。
bucketName := "examplebucket"
// オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めることはできません。
objectName := "exampleobject.txt"
// ローカルファイルの完全なパスを指定します。 指定したローカルファイルが存在する場合、そのファイルは上書きされます。 存在しない場合は作成されます。
// ローカルパスを指定しない場合、ダウンロードされたファイルは、デフォルトでサンプルプログラムが存在するプロジェクトのローカルパスに保存されます。
localFile := "D:\\localpath\\examplefile.txt"
// バケットを取得します。
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// プログレスバー付きでファイルをダウンロードします。
err = bucket.GetObjectToFile(objectName, localFile, oss.Progress(&OssProgressListener{}))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("Transfer Completed.")
}