讀取及寫入 Google Cloud Storage

本文件說明如何使用 Google Cloud Storage 用戶端程式庫,在 App Engine 應用程式中透過 Cloud Storage 儲存及擷取資料。本文假設您已依設定 Google Cloud Storage 一文的指示啟用 Cloud Storage 值區及下載用戶端程式庫,同時假設您知道如何依 Java 8 App Engine 標準環境的快速入門導覽課程中所述建構 App Engine 應用程式。

必要匯入項目

以下程式碼片段示範要透過用戶端程式庫存取 Cloud Storage 所需的匯入項目:

import com.google.appengine.tools.cloudstorage.GcsFileOptions;
import com.google.appengine.tools.cloudstorage.GcsFilename;
import com.google.appengine.tools.cloudstorage.GcsInputChannel;
import com.google.appengine.tools.cloudstorage.GcsOutputChannel;
import com.google.appengine.tools.cloudstorage.GcsService;
import com.google.appengine.tools.cloudstorage.GcsServiceFactory;
import com.google.appengine.tools.cloudstorage.RetryParams;

指定 Cloud Storage 值區

以下程式碼片段示範一種可讓使用者在將檔案寫入值區時指定值區名稱的方法:

function uploadFile() {
  var bucket = document.forms["putFile"]["bucket"].value;
  var filename = document.forms["putFile"]["fileName"].value;
  if (bucket == null || bucket == "" || filename == null || filename == "") {
    alert("Both Bucket and FileName are required");
    return false;
  } else {
    var postData = document.forms["putFile"]["content"].value;
    document.getElementById("content").value = null;

    var request = new XMLHttpRequest();
    request.open("POST", "/gcs/" + bucket + "/" + filename, false);
    request.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
    request.send(postData);
  }
}

該程式碼片段會在使用者提供的值區和檔案名稱前面加上所需的 /gcs/

寫入 Cloud Storage

如何將檔案寫入 Cloud Storage:

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  GcsFileOptions instance = GcsFileOptions.getDefaultInstance();
  GcsFilename fileName = getFileName(req);
  GcsOutputChannel outputChannel;
  outputChannel = gcsService.createOrReplace(fileName, instance);
  copy(req.getInputStream(), Channels.newOutputStream(outputChannel));
}

本範例會將新的檔案寫入 Cloud Storage,或者如果已有同名的檔案,則會覆寫該檔案。這種做法很有用,因為將檔案寫入 Cloud Storage 後就無法修改。如要變更檔案,您必須先修改檔案的複本,然後再覆寫舊的檔案。

從 Cloud Storage 讀取

如何從 Cloud Storage 讀取檔案:

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  GcsFilename fileName = getFileName(req);
  if (SERVE_USING_BLOBSTORE_API) {
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    BlobKey blobKey = blobstoreService.createGsBlobKey(
        "/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName());
    blobstoreService.serve(blobKey, resp);
  } else {
    GcsInputChannel readChannel = gcsService.openPrefetchingReadChannel(fileName, 0, BUFFER_SIZE);
    copy(Channels.newInputStream(readChannel), resp.getOutputStream());
  }
}

在包含 gcsService.openPrefetchingReadChannel 的列中,請注意示例使用了 prefetching 一字。如此可將資料緩衝在記憶體中,並在需要資料前預先擷取,以避免阻礙讀取呼叫。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Java 8 適用的 App Engine 標準環境