4

Я разрабатываю веб-приложение с помощью Google app engine для Java. Я буду использовать хранилище Google Cloud и в соответствии с documentation, я использую библиотеку клиентов GCS для эмуляции облачного хранилища на локальном диске.которые являются файлами uri на GAE java эмуляции облачного хранилища с помощью GCS-клиентской библиотеки?

У меня нет никаких проблем сохранения файлов, я могу видеть их от затмения в папке войны (по пути WEB-INF/AppEngine сгенерированные), и я могу видеть их с веб-панели администратора доступны из URL

локальный: 8888/_ah/админ

, как указано в этом question

Мой вопрос заключается в следующем. Каковы файлы URI под локальным хостом для доступа к ним с эмуляцией GCS?

Пример одного из загруженных файлов на локальном хосте:

  • ключевой файл aglub19hcHBfaWRyJwsSF19haF9GYWtlQ2xvdWRTdG9yYWdlX18xIgpxcmNvZGUuanBnDA
  • ID/имя encoded_gs_key: L2dzLzEvcXJjb2RlLmpwZw
  • имя файла /gs/1/qrcode.jpg

Заранее спасибо.

+0

Можете ли вы уточнить, что вы спрашиваете? Я не совсем понимаю, что вы ищете. – jterrace

+0

Возможно, я не понимаю, как работает GCS. Когда я загружаю файл, я ожидаю, что он достигнет URL-адреса, предоставленного GCS. Это правильно? Я работал с облаком rackspace и работает таким образом. Могу ли я получить доступ к моему файлу GCS только через мое приложение? Разве нет публичного URL-адреса, доступного кому-либо? –

+0

@MichelantonioTrizio Sei riuscito alla fine a sistemare il problema col GCS? Вы исправили свой проект, потому что я делаю то же самое. Спасибо :-) – Aerox

ответ

3

Вы можете увидеть, как это делается здесь: https://code.google.com/p/appengine-gcs-client/source/browse/trunk/java/src/main/java/com/google/appengine/tools/cloudstorage/dev/LocalRawGcsService.java

На сегодняшний день это отображение того, ведущихся с использованием локального хранилища данных. Это может измениться в будущем, но вы должны иметь возможность просто вызвать этот класс или один из классов более высокого уровня, предоставляемых клиентом GCS, чтобы получить данные.

3

Использование getServingUrl()

Локальный файл ГКС сохраняется в формате BLOB. При сохранении я могу использовать местоположение, например, ваше имя файла «/gs/1/qrcode.jpg» Однако при доступе к нему это поддельное местоположение не работает. Я нашел способ. Это может быть не самое лучшее, но работает для меня.

BlobKey bk = BlobstoreServiceFactory.getBlobstoreService().createGsBlobKey(location); 
String url = ImagesServiceFactory.getImagesService().getServingUrl(bk); 

URL-адрес будет как:

http://127.0.0.1:8080/_ah/img/encoded_gs_key:yourkey 

(я был едва ли найти прямое решение по поиску Google Я надеюсь, что этот ответ может помочь другим нуждающимся.).

ресурсов : ImagesServiceFactoryImageService FileServiceFactory

+0

Точно, его содержимое в объекте «__GsFileInfo__» использует весь контент в столбце «ID/Name». – drindt

0

Для тех, кто желает обслуживать местные ГКС файлы, которые были созданы с помощью библиотеки GAE ГКС, одно решение выставить Java Servlet, как это:

package my.applicaion.servlet; 

import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import com.google.appengine.api.blobstore.BlobKey; 
import com.google.appengine.api.blobstore.BlobstoreService; 
import com.google.appengine.api.blobstore.BlobstoreServiceFactory; 

public final class GoogleCloudStorageServlet 
    extends HttpServlet 
{ 

    @Override 
    protected void doGet(final HttpServletRequest request, final HttpServletResponse response) 
     throws ServletException, IOException 
    { 
    final BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 
    final String fileName = "/gs" + request.getPathInfo(); 
    final BlobKey blobKey = blobstoreService.createGsBlobKey(fileName); 
    blobstoreService.serve(blobKey, response); 
    } 

} 

и в вашей сети.XML:

<servlet> 
    <servlet-name>GoogleCloudStorage</servlet-name> 
    <servlet-class>my.applicaion.servlet.GoogleCloudStorageServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>GoogleCloudStorage</servlet-name> 
    <url-pattern>/gcs/*</url-pattern> 
</servlet-mapping> 

Если вы размещаете этот сервлет в приложении GAE, URL-адрес для доступа к файлу ГКС с ковшом bucket-name и с именем fileName является http://localhost:8181:/gcs/bucket-name/fileName, локальный GAE сервер разработки номер порта является 8181.

Это работает хотя бы от GAE v1.9.50.

И если вы собираетесь иметь локальный сервер ГКС работает в модульном тесте с Jetty, вот обходным, надеюсь, с правильными комментариями:

final int localGcsPortNumber = 8081; 
    final Server localGcsServer = new Server(localGcsPortNumber); 
    final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); 
    final String allPathSpec = "/*"; 
    context.addServlet(new ServletHolder(new HttpServlet() 
    { 

    @Override 
    protected void service(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     final BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 
     final String fileName = "/gs" + request.getRequestURI(); 
     final BlobKey blobKey = blobstoreService.createGsBlobKey(fileName); 

     if (blobKey != null) 
     { 
     // This is a work-around over the "ServeBlobFilter" which does not take the "Content-Type" from the "blobInfo", but attempts to retrieve it from the "blobKey" 
     final BlobInfo blobInfo = BlobStorageFactory.getBlobInfoStorage().loadGsFileInfo(blobKey); 
     if (blobInfo != null) 
     { 
      final String contentType = blobInfo.getContentType(); 
      if (contentType != null) 
      { 
      response.addHeader(HttpHeaders.CONTENT_TYPE, contentType); 
      } 
     } 
     } 

     blobstoreService.serve(blobKey, response); 
    } 

    }), allPathSpec); 
    // The filter is responsible for taken the "blobKey" from the HTTP header and for fulfilling the response with the corresponding GCS content 
    context.addFilter(ServeBlobFilter.class, allPathSpec, EnumSet.of(DispatcherType.REQUEST)); 
    // This attribute must be set, otherwise a "NullPointerException" is thrown 
    context.getServletContext().setAttribute("com.google.appengine.devappserver.ApiProxyLocal", LocalServiceTestHelper.getApiProxyLocal()); 
    localGcsServer.setHandler(context); 
    localGcsServer.start(); 
Смежные вопросы