如何将文件写入谷歌云存储默认桶

时间:2014-07-24 03:17:51

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

我正在尝试使用以下代码将文件写入Google云端存储(GCS)。

AppIdentityService appIdentityService = AppIdentityServiceFactory.getAppIdentityService();
Stirng defaultBucketName = appIdentityService.getDefaultGcsBucketName();
String fileName = "MyGcsFile-1.json";
String mimeType = "application/json";
GcsService gcsService = GcsServiceFactory.createGcsService();

GcsFilename file = new GcsFilename(defaultBucketName, fileName);
GcsFileOptions.Builder builder = new GcsFileOptions.Builder();
GcsFileOptions options = builder.mimeType(mimeType).build();     
GcsOutputChannel channel = gcsService.createOrReplace(file, options);
PrintWriter writer = new PrintWriter(Channels.newWriter(channel, "UTF8"));
writer.print(fileContent);
writer.close();
channel.close();

但是当我尝试使用代码从GCS获取文件时:

AppIdentityService appIdentityService = AppIdentityServiceFactory.getAppIdentityService();
Stirng defaultBucketName = appIdentityService.getDefaultGcsBucketName();
String fileName = "MyGcsFile-1.json";

GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename gcsFile =  new GcsFilename(defaultBucketName, fileName);
GcsInputChannel readChannel = gcsService.openReadChannel(gcsFile, new Long(0));
InputStream is = Channels.newInputStream(readChannel);
JsonFactory j = new JsonFactory();
org.codehaus.jackson.JsonParser jp = j.createJsonParser(is);

获取FileNotFoundException

java.io.FileNotFoundException
at com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:615)
at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:594)
at com.google.appengine.api.files.FileServiceImpl.read(FileServiceImpl.java:553)
at com.google.appengine.api.files.FileServiceImpl.read(FileServiceImpl.java:431)
at com.google.appengine.api.files.FileReadChannelImpl.read(FileReadChannelImpl.java:84)
at com.google.appengine.tools.cloudstorage.dev.LocalRawGcsService.readObjectAsync(LocalRawGcsService.java:271)
at com.google.appengine.tools.cloudstorage.SimpleGcsInputChannelImpl$1.call(SimpleGcsInputChannelImpl.java:87)
at com.google.appengine.tools.cloudstorage.SimpleGcsInputChannelImpl$1.call(SimpleGcsInputChannelImpl.java:81)
at com.google.appengine.tools.cloudstorage.RetryHelper.doRetry(RetryHelper.java:108)
at com.google.appengine.tools.cloudstorage.RetryHelper.runWithRetries(RetryHelper.java:166)
at com.google.appengine.tools.cloudstorage.RetryHelper.runWithRetries(RetryHelper.java:156)
at com.google.appengine.tools.cloudstorage.SimpleGcsInputChannelImpl.read(SimpleGcsInputChannelImpl.java:81)
at sun.nio.ch.ChannelInputStream.read(Unknown Source)
at sun.nio.ch.ChannelInputStream.read(Unknown Source)
at sun.nio.ch.ChannelInputStream.read(Unknown Source)
at org.codehaus.jackson.impl.ByteSourceBootstrapper.ensureLoaded(ByteSourceBootstrapper.java:507)
at org.codehaus.jackson.impl.ByteSourceBootstrapper.detectEncoding(ByteSourceBootstrapper.java:129)
at org.codehaus.jackson.impl.ByteSourceBootstrapper.constructParser(ByteSourceBootstrapper.java:224)
at org.codehaus.jackson.JsonFactory._createJsonParser(JsonFactory.java:785)
at org.codehaus.jackson.JsonFactory.createJsonParser(JsonFactory.java:561)

上述代码中的问题在哪里?在向GCS写文件?或从GCS读取文件?

2 个答案:

答案 0 :(得分:2)

此处我的App Engine是在1.9.0发布之前创建的。这样就没有为我的帐户创建默认存储桶。在这里,我必须手动创建默认存储桶。以下是Google documentation的详细信息:

使用默认GCS存储桶

默认存储桶不需要进一步激活,配置或权限,也不需要注册GCS。水桶就在那里,随时可以免费配额使用。如果您使用此选项,则无需为应用程序计费。

  • 如果您的应用是在App Engine 1.9.0发布之后创建的,那么它已经有一个默认的GCS存储桶:会自动使用您的应用创建。
  • 如果您的应用是在App Engine 1.9.0发行版之前创建的,则可以通过单击App Engine管理控制台的“应用程序设置”页面中的“云集成”部分中的“创建”来获取默认存储桶。

默认存储桶名称通常为< app_id> .appspot.com,您可以在其中替换为您的应用ID。您可以在App Engine管理控制台“应用程序设置”页面的Google Cloud Storage Bucket标签下找到存储桶名称。或者,您可以使用App Identity getDefaultGcsBucketName方法以编程方式查找名称。

答案 1 :(得分:0)

看起来你可能会失踪:

channel.write(ByteBuffer src)

存储文件时。