我想使用GCS存储桶作为我的blobstore的支持,但我无法弄清楚如何在我的开发服务器上设置一个。
有关使用实时服务器上的开发人员控制台执行此操作的说明,但我找不到有关如何在本地开发计算机上执行此操作的信息...
答案 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
登录。