LOULIZCategoryプライバシーポリシー

Cloud StorageからダウンロードとアップロードするGo言語コード

『Google Cloud Platform』は非常によく出来たクラウドであり、その中には仮想マシンを提供する『Compute Engine(GCE)』やオブジェクトストレージである『Storage』があります。

これらのサービスはGo言語でも簡単に扱うことが出来て、当記事では『Storage』に保存した画像ファイルを『GCE』にダウンロードし、別ファイルとして『Storage』にアップロードするコードをご紹介します。

もちろん、テキストファイルや他のファイルでも可能です。

Contents

コードの紹介

今回は『yufi.jp』というバケット内にある『image』フォルダの中にある『test1.jpg』というファイルをダウンロードし、同フォルダ内の『test2.jpg』というファイルとしてアップロードしています。

Go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package main

import (
    "bytes"
    "context"
    "log"

    "cloud.google.com/go/storage"
)

func main() {
    ctx := context.Background()

    client, err := storage.NewClient(ctx) // クライアント作成
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()

    bucket := client.Bucket("yufi.jp") // 接続先バケット

    obj := bucket.Object("image/test1.jpg") // ダウンロードするオブジェクト

    r, err := obj.NewReader(ctx) // ダウンロードするためのリーダー
    if err != nil {
        log.Fatal(err)
    }
    defer r.Close()

    buff := new(bytes.Buffer)
    _, err = buff.ReadFrom(r) // ダウンロード実行
    if err != nil {
        log.Fatal(err)
    }

    outObj := bucket.Object("image/test2.jpg") // アップロード先オブジェクト

    w := outObj.NewWriter(ctx) // アップロードするためのライター
    defer w.Close()

    _, err = buff.WriteTo(w) // アップロード実行
    if err != nil {
        log.Fatal(err)
    }
}

コードの解説

必要なパッケージ

Go
1
2
3
4
5
6
7
import (
    "bytes"
    "context"
    "log"

    "cloud.google.com/go/storage"
)

『bytes』パッケージは、ダウンロードしたデータを一時保管するバイトバッファーを利用するために使用します。『cloud.google.com/go/storage』は GCP の Storage を扱うためのライブラリです。

以下のコマンドを使用してダウンロードとインストールを行っておいて下さい。

go get cloud.google.com/go/storage

コンテキストを作成して、クライアントも作成する

Go
1
2
3
4
5
6
7
ctx := context.Background()

client, err := storage.NewClient(ctx) // クライアント作成
if err != nil {
    log.Fatal(err)
}
defer client.Close()

最初に『context.Background』関数を使用してコンテキストを作成し、『storage』パッケージの『NewClient』関数に渡して、Storage に接続するためにクライアントを作成します。

エラーチェックを行い、必要が無くなれば閉じるように『defer client.Close()』としておきます。

使用するバケットとオブジェクトを指定する

Go
1
2
3
bucket := client.Bucket("yufi.jp") // 接続先バケット

obj := bucket.Object("image/test1.jpg") // ダウンロードするオブジェクト

先ほど作成したクライアントの『Bucket』関数に使用するバケット名を渡して、『bucket』を用意します。バケット名は実際に使用するものを指定して下さい。

そして、そのバケットの『Object』関数にダウンロード対象のオブジェクトアドレスを渡します。今回は『image』フォルダ内にある『test1.jpg』というファイルを指定しています。

ダウンロードに必要なリーダーを作成します

Go
1
2
3
4
5
r, err := obj.NewReader(ctx) // ダウンロードするためのリーダー
if err != nil {
    log.Fatal(err)
}
defer r.Close()

先ほど用意したオブジェクトの『NewReader』関数にコンテキストを渡してリーダを作成します。このリーダーを使用してダウンロードを行うようになります。

ダウンロードを実行する

Go
1
2
3
4
5
buff := new(bytes.Buffer)
_, err = buff.ReadFrom(r) // ダウンロード実行
if err != nil {
    log.Fatal(err)
}

まず、ダウンロードしたデータを保管しておくために『new(bytes.Buffer)』としてバイトバッファーを用意します。

そして、バッファーの『ReadFrom』関数にリーダーを渡してダウンロードします。ダウンロードしたデータはバッファーに入っており、戻り値にはダウンロードしたバイト数とエラーが返ってきます。

アップロードする

Go
1
2
3
4
5
6
7
8
9
outObj := bucket.Object("image/test2.jpg") // アップロード先オブジェクト

w := outObj.NewWriter(ctx) // アップロードするためのライター
defer w.Close()

_, err = buff.WriteTo(w) // アップロード実行
if err != nil {
    log.Fatal(err)
}

アップロードはダウンロードと似たような手順となります。

まずアップロード先オブジェクトを指定し、アップロードするためのライターを作成し、そして『WriteTo』関数にライターを渡してアップロードします。

WriteTo 関数の戻り値はアップロードしたデータのバイト数と、エラー値です。

アップロードする際に指定したオブジェクトが存在しなかった場合、新規にオブジェクトが作成されます。

終わりに

ソースコードを見ていただけると分かりますが、行数は多いですがほとんどがエラー処理や Close 処理です。ダウンロードもアップロードもとてもシンプルですよね。

参考になれば幸いです。


初心者でも簡単に高速で大規模なシステムを作れる『Go言語』のススメ

Go言語でシンプルで簡単なHTTPサーバーの作り方

Go言語で複数ドメインにも対応可能なHTTPSサーバーの作り方

Go言語でGCPのGCEからCloud SQLインスタンスへ接続する方法

Go言語でデータをキャッシュしたい時に便利な『go-cache』の使い方

Go言語でタイトルなどを動的に埋め込んでHTMLを出力するテンプレートの書き方

Markdown記法で書かれたものをHTMLに変換するGo言語コード

Go言語でシンプルなHTTPキャッシュヘッダーの作り方

Webサーバーから送信するデータをgzip圧縮するGo言語コード

画像をアルゴリズムを選んで簡単にすぐにリサイズするGo言語コードの紹介と解説

WWW無しへ、HTTPSなどへリダイレクトを行うGo言語コードの紹介と解説

GAEでGo言語製ウェブサーバーのためのapp.yamlの基本的な書き方

GAEで初めてのGo言語製ウェブサーバーの作り方

GAEのスタンダード環境でGo言語を使ってログを出力する方法

GAEのスタンダード環境からGo言語でDatastoreの基本操作を行う方法

Goプログラムの実行方法と画面に文字列を表示させよう![Go言語入門]

コードの中にコードの解説。コメントの書き方![Go言語入門]

基本的なデータの扱い方と種類[Go言語入門]

条件分岐、if、elseなどの使い方 [Go言語入門]

Go言語入門、そしてステップアップに最適なおすすめの本をご紹介!

Go言語での開発もこれで楽々!Visual Studio Code をご紹介!

GCPのロードバランサでクライアントがHTTPS接続かどうかを確認する方法

タグや要素、HTMLの基礎の解説【HTML・CSS入門】

AMP化HTML・CSSの作り方の基礎

アドセンスをAMPページでも表示する方法

CSSの超基礎を解説【HTML・CSS】

class属性とid属性【HTML・CSS入門】

軽量で多言語に対応、簡単に使えるシンタックスハイライト『Prism』

サイト作りが楽しく簡単になる、オススメの便利なサイトをいくつかご紹介