如何在本地开发服务器上启用Google云端存储?

时间:2015-04-13 03:15:42

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

我想使用GCS存储桶作为我的blobstore的支持,但我无法弄清楚如何在我的开发服务器上设置一个。

有关使用实时服务器上的开发人员控制台执行此操作的说明,但我找不到有关如何在本地开发计算机上执行此操作的信息...

4 个答案:

答案 0 :(得分:21)

原来你根本不需要进行任何设置。我只是假设在使用blobstore上传时有一个具有特定名称的名称,并且自动为我创建了一个名称。

顺便说一句,在任何地方都没有记录如何浏览开发服务器存储中的文件。您可以通过在数据存储查看器管理员访问本地开发服务器中选择__GsFileInfo__实体来执行此操作。

答案 1 :(得分:10)

对于那些试图让Google云端存储从本地Java开发应用服务器上工作的人来说,我认为还有一个答案会有所帮助。我设法让我的本地开发应用服务器与非本地Google云端存储一起工作,但只是挖掘代码并找出所需内容 - 似乎没有关于此的文档。

目标是让这个代码块在本地工作,从GCS读取文件:

    GcsService gcsService =
       GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
    int fileSize = (int) gcsService.getMetadata(gcsFilename).getLength();
    ByteBuffer byteBuffer = ByteBuffer.allocate(fileSize);
    GcsInputChannel inputChannel = gcsService.openReadChannel(gcsFilename, 0);
    int readResult = inputChannel.read(byteBuffer);
    byte[] fileBytes = byteBuffer.array();

如果您尝试在本地执行此操作,则无法找到您上传到GCS的任何文件,因为它会尝试使用虚假的本地GCS。遗憾的是,我还没有找到上传到本地GCS的好方法,所以这不是非常有用(因为云版本中没有文件浏览器,而且gsutil没有'为它工作)。因此,在本地开发者应用服务器上运行时,我们会让它与非本地(云)GCS一起工作。

为此,请注意GcsService是通过以下代码块在com.google.appengine.tools.cloudstorage.GcsServiceFactory中创建的:

if (location == SystemProperty.Environment.Value.Production || hasCustomAccessTokenProvider()) {
  rawGcsService = OauthRawGcsServiceFactory.createOauthRawGcsService(builder.build());
} else if (location == SystemProperty.Environment.Value.Development) {
  rawGcsService = LocalRawGcsServiceFactory.createLocalRawGcsService();

上面说过,您需要指定一个自定义访问令牌提供程序来获取非本地服务,您可以通过定义系统属性来执行此操作。对于app引擎应用,您可以在appengine-web.xml中执行此操作:

<system-properties>
    <property name="gcs_access_token_provider" value="com.mypackage.MyAccessTokenProvider" />
</system-properties>

该属性的值是您定义的实现com.google.appengine.tools.cloudstorage.oauth.AccessTokenProvider的类,它为您的应用提供访问令牌。该类需要使用&#34;其他&#34;的说明创建一个GoogleCredential,可用于获取访问令牌。对于https://developers.google.com/identity/protocols/OAuth2ServiceAccount#authorizingrequests上的GoogleCredential。

现在它将创建一个与云通信的OAuth GcsService,并且您不需要使用虚假的本地存储。

答案 2 :(得分:4)

您需要下载并集成App Engine的Google Cloud Storage Client Library

此库为您提供与GcsService类似的BlobstoreService,因此您可以编写文件,读取文件,删除文件以及 Cloud Storage提供的其他功能

在开发环境中使用代码时,上传的文件存储在appengine-generated文件夹中,并在本地数据存储区中创建__GsFileInfo__实体,该实体保留附加到文件的元数据

此库也可在线工作,因此您的代码适用于开发和生产环境。

您可以在此处找到Getting Started指南和完整的JavaDoc参考

答案 3 :(得分:0)

认为这可以使用一些最近的发现。对我来说,本地云存储根本不起作用。它失败并显示一条错误消息,指出 GsFileInfo 是受保护的实体。如果您不启动本地数据存储模拟器(这意味着它使用了远程云存储),它会很好地工作。

这似乎与Google的最新文档有关:https://cloud.google.com/appengine/docs/standard/java/using-cloud-storage#using_cloud_storage_with_the_local_development_server

  

App Engine本地开发服务器未模拟云存储,   因此,所有云存储请求都必须通过Internet发送到   实际的云存储桶。

因此,@ learnj12的答案是最好的方法。但是GoogleCredential已被弃用,目前尚不清楚如何实现com.google.appengine.tools.cloudstorage.oauth.AccessTokenProvider。

这对我有用:

import com.google.appengine.api.appidentity.AppIdentityService;
import com.google.appengine.api.appidentity.AppIdentityServiceFactory;
import com.google.appengine.tools.cloudstorage.oauth.AccessTokenProvider;

public class GCSTokenProvider implements AccessTokenProvider {
  @Override
  public AppIdentityService.GetAccessTokenResult getNewAccessToken(List<String> list) {
    return AppIdentityServiceFactory.getAppIdentityService().getAccessToken(Collections.singleton("cloud-platform"));
  }
}

NB。我正在使用服务帐户,并且使用gcloud登录。

相关问题