如何从独立的Java应用程序(而不是GAE网络应用程序)连接到本地谷歌云存储?

时间:2014-03-26 20:05:37

标签: java google-app-engine google-cloud-storage

我在GAE应用程序中创建Google Cloud Datoreore中的一些数据,并将一些二进制文件存储到Google云端存储中 - 让我们调用应用程序 WebApp 。 现在我在Google计算引擎上运行了不同的应用程序。让我们调用应用程序 ComputeApp

ComputeApp 是一个后端流程,负责处理 WebApp 创建的数据。我之前在in this question询问了我可以使用哪种API与 ComputeApp 中的Storage进行通信。我使用Google Cloud Storage JSON API Client Library for Java实现了存储通信。

就我与Google云端的存储进行通信而言,一切正常。我使用的是服务帐户身份验证。

现在我需要在我的开发PC中本地运行我的ComputeApp,以便我将本地 WebApp 创建的数据存储到本地调试存储中。我需要它,因为我想拥有一个测试环境,所以我可以在本地调试app。 我在本地运行的WebApp将二进制数据存储到本地数据存储区。我可以通过本地管理控制台看到它:(localhost:8080 / _ah / admin)。有 GsFileInfo 实体列表和__ah_FakeCloudStorage ...实体列表,代表我的存储数据。

如何修改 ComputeApp 代码以强制连接到我的本地调试存储并访问本地存储的这些二进制数据而不是连接到Google云?< / p>

1 个答案:

答案 0 :(得分:0)

在Google Project Console和服务帐户凭据中创建帐户

初​​始化:

private static final String APPLICATION_NAME = "your-webapp";
      private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

       GoogleCredential credential = GoogleCredential.getApplicationDefault();
              if (credential.createScopedRequired()) {
                credential = credential.createScoped(StorageScopes.all());
              }
              HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
              storageService = new Storage.Builder(httpTransport, JSON_FACTORY, credential)
                  .setApplicationName(APPLICATION_NAME).build();



   InputStreamContent mediaContent = new InputStreamContent(contentType, inputStream);


    StorageObject objectMetadata = null;
      objectMetadata = new StorageObject()
          .setName(name)
          .setMetadata(ImmutableMap.of("date", new Date().toString()))
          .setAcl(ImmutableList.of(
             new ObjectAccessControl().setEntity("allUsers").setRole("READER")

              ))
          .setContentDisposition("attachment");


    Storage.Objects.Insert insertObject = storageService.objects().insert("staging.your-app.appspot.com", objectMetadata,
        mediaContent);


    // For small files, you may wish to call setDirectUploadEnabled(true), to
    // reduce the number of HTTP requests made to the server.
    if (mediaContent.getLength() > 0 && mediaContent.getLength() <= 2 * 1000 * 1000 /* 2MB */) {
      insertObject.getMediaHttpUploader().setDirectUploadEnabled(true);
    }

    insertObject.execute();