2015-11-04 3 views
0

Я создаю данные на сервере (gae), и я хочу сохранить его в Blobstore. Я видел много ответов о том, как это сделать, указывая URL-адрес BlobStore для клиента, но клиент или HTTP-запрос отсутствуют: это просто асинхронная задача.Загрузка серверной части в Blobstore - Java Google Appengine

  1. Тогда я думаю, я должен использовать createUploadUrl(), и вместо того, чтобы дать этот URL клиенту, от моего кода HTTP POST мои данные к нему через URL Fetch. Это выглядит странно, для этого нет другого API?

  2. Предположим, что файлы, которые я хочу в Blobstore, уже сохранены в моем контейнере по умолчанию GCS. Могу ли я просто сообщить Blobstore о них, используя расположение gcs «/ gs/bucketname/file»? Я попробовал это,


GcsFilename filename = new GcsFilename(bucketName, fileId); 
String gcsKey = "/gs/" + bucketName + "/" + filename.getObjectName(); 
BlobKey blobKey = blobstoreService.createGsBlobKey(gcsKey); 
GcsOutputChannel outputChannel = gcsService.createOrReplace(filename, GcsFileOptions.getDefaultInstance()); 
ObjectOutputStream oout = new ObjectOutputStream(Channels.newOutputStream(outputChannel)); 
oout.writeObject(myDataObjectToPersist); 
oout.close(); 

// ...at some other point I have checked the file is correctly stored in 
// GCS and I can fetch it using /gs/bucket/fileId 
// but it doesn't seem to be in Blobstore, so when 
InputStream stream = new BlobstoreInputStream(new BlobKey(blobKey.keyString)) 
// ... this gives a BlobstoreInputStream$BlobstoreIOException: BlobstoreInputStream received an invalid blob key... 

Является ли это что-то концептуально неправильно - как если я использую GcsOutputChannel, чтобы сохранить его я не буду получать его от Blobstore даже если я создаю BlobKey, или что-то, что может работать, но Я просто сделал что-то не так?

1K благодаря

ответ

1

Почему вы хотите сохранить файл в Blobstore в отличие от записи и чтения непосредственно из ГКС?

Да, вы можете создать BlobKey для файла, хранящегося в GCS, и можете использовать ключ в некоторых из API blobstore (например, fetchData и serve), но, к сожалению, не во всех. Некоторые из API blobstore (например, BlobstoreInputStream) зависят от BlobInfo и не создаются при использовании клиента GCS.

+0

Есть много причин, которые можно было бы хотеть. Это как спросить, какие преимущества Blobstore, не так ли? :) Но если вы скажете, что я могу создать URL-адрес загрузки для любого файла в GCS, то это дает меньшую выгоду. В моем случае это также требования и унаследованные причины. Я думаю, что fetchData даст мне то, что я хочу, спасибо. И о моем вопросе 1, я думаю, вы подтверждаете, что единственное, что я могу сделать, это HTTP-сообщение из моего приложения-сервера. –

+0

Да, нет никакого способа написать прямо в blobstore. Файлы api, которые раньше делали это, теперь устарели (https://cloud.google.com/appengine/docs/java/googlecloudstorageclient/migrate). – ozarov