Membaca dan menulis ke Cloud Storage

Dokumen ini menjelaskan cara menyimpan dan mengambil data menggunakan library klien Cloud Storage. Anda dianggap telah menyelesaikan tugas yang dijelaskan dalam artikel Menyiapkan Cloud Storage untuk mengaktifkan bucket Cloud Storage dan mendownload library klien. Anda juga dianggap telah memahami cara membuat aplikasi App Engine.

Untuk contoh kode tambahan, lihat Library klien Cloud Storage

Impor yang diperlukan

Impor file yang diperlukan untuk App Engine dan Cloud Storage adalah:

  • google.golang.org/appengine,
  • google.golang.org/appengine/file
  • cloud.google.com/go/storage

seperti yang ditunjukkan dalam cuplikan berikut:

import (
	"bytes"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"strings"

	"cloud.google.com/go/storage"
	"golang.org/x/net/context"
	"google.golang.org/api/iterator"
	"google.golang.org/appengine"
	"google.golang.org/appengine/file"
	"google.golang.org/appengine/log"
)

Menentukan bucket Cloud Storage

Sebelum dapat menjalankan operasi Cloud Storage, Anda harus memberikan nama bucket. Cara termudah untuk melakukannya adalah dengan menggunakan bucket default untuk project Anda, yang dapat diperoleh dari konteks App Engine, seperti yang ditunjukkan dalam cuplikan ini:

// Use `dev_appserver.py --default_gcs_bucket_name GCS_BUCKET_NAME`
// when running locally.
bucket, err := file.DefaultBucketName(ctx)
if err != nil {
	log.Errorf(ctx, "failed to get default GCS bucket name: %v", err)
}

Menulis ke Cloud Storage

Untuk menulis file ke Cloud Storage:

// createFile creates a file in Google Cloud Storage.
func (d *demo) createFile(fileName string) {
	fmt.Fprintf(d.w, "Creating file /%v/%v\n", d.bucketName, fileName)

	wc := d.bucket.Object(fileName).NewWriter(d.ctx)
	wc.ContentType = "text/plain"
	wc.Metadata = map[string]string{
		"x-goog-meta-foo": "foo",
		"x-goog-meta-bar": "bar",
	}
	d.cleanUp = append(d.cleanUp, fileName)

	if _, err := wc.Write([]byte("abcde\n")); err != nil {
		d.errorf("createFile: unable to write data to bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}
	if _, err := wc.Write([]byte(strings.Repeat("f", 1024*4) + "\n")); err != nil {
		d.errorf("createFile: unable to write data to bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}
	if err := wc.Close(); err != nil {
		d.errorf("createFile: unable to close bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}
}

Saat file dibuat, sampel akan menentukan header Cloud Storage (x-goog-meta-foo dan x-goog-meta-bar). Kode opsional ini memperkenalkan gagasan penggunaan header Cloud Storage, yang dapat Anda terapkan ke:

  • Memengaruhi perilaku permintaan
  • Tentukan akses ke file dalam bucket yang berbeda dengan setelan default-nya (lihat x-goog-acl)
  • Tulis metadata file.

Header x-goog-meta-* yang ditampilkan di atas adalah metadata file kustom yang dapat Anda tetapkan; header ini selalu ditampilkan dengan file. Perhatikan bahwa ruang yang tersedia untuk header kustom dan datanya terbatas hingga beberapa kilobyte, jadi gunakan ruang penyimpanan ini dengan hati-hati.

Karena contoh kode tidak menetapkan x-goog-acl, ACL Cloud Storage default dari pembacaan publik diterapkan ke objek saat ditulis ke bucket.

Terakhir, perhatikan panggilan ke Close() file setelah Anda menyelesaikan penulisan. Jika Anda tidak melakukan hal ini, file tidak akan ditulis ke Cloud Storage. Perlu diketahui bahwa setelah memanggil Close(), Anda tidak dapat menambahkan ke file.

Membaca dari Cloud Storage

Untuk membaca file dari Cloud Storage:

// readFile reads the named file in Google Cloud Storage.
func (d *demo) readFile(fileName string) {
	io.WriteString(d.w, "\nAbbreviated file content (first line and last 1K):\n")

	rc, err := d.bucket.Object(fileName).NewReader(d.ctx)
	if err != nil {
		d.errorf("readFile: unable to open file from bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}
	defer rc.Close()
	slurp, err := ioutil.ReadAll(rc)
	if err != nil {
		d.errorf("readFile: unable to read data from bucket %q, file %q: %v", d.bucketName, fileName, err)
		return
	}

	fmt.Fprintf(d.w, "%s\n", bytes.SplitN(slurp, []byte("\n"), 2)[0])
	if len(slurp) > 1024 {
		fmt.Fprintf(d.w, "...%s\n", slurp[len(slurp)-1024:])
	} else {
		fmt.Fprintf(d.w, "%s\n", slurp)
	}
}

Mencantumkan konten bucket

Kode contoh ini menunjukkan cara menampilkan daftar konten bucket:

// listBucket lists the contents of a bucket in Google Cloud Storage.
func (d *demo) listBucket() {
	io.WriteString(d.w, "\nListbucket result:\n")

	query := &storage.Query{Prefix: "foo"}
	it := d.bucket.Objects(d.ctx, query)
	for {
		obj, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			d.errorf("listBucket: unable to list bucket %q: %v", d.bucketName, err)
			return
		}
		d.dumpStats(obj)
	}
}

Menghapus file di Cloud Storage

Kode di bawah ini menunjukkan cara menghapus file dari Cloud Storage menggunakan metode ObjectHandle.delete().


// deleteFiles deletes all the temporary files from a bucket created by this demo.
func (d *demo) deleteFiles() {
	io.WriteString(d.w, "\nDeleting files...\n")
	for _, v := range d.cleanUp {
		fmt.Fprintf(d.w, "Deleting file %v\n", v)
		if err := d.bucket.Object(v).Delete(d.ctx); err != nil {
			d.errorf("deleteFiles: unable to delete bucket %q, file %q: %v", d.bucketName, v, err)
			return
		}
	}
}

Contoh ini membersihkan file yang ditulis ke bucket di bagian Menulis ke Cloud Storage.

Langkah selanjutnya