Какие файлы uri на GAE java эмулируют облачное хранилище с клиентской библиотекой GCS?

Я разрабатываю веб-приложение с использованием движка приложений Google для Java. Я буду использовать облачное хранилище Google и, согласно документации, я Я использую клиентскую библиотеку GCS для имитации облачного хранилища на локальном диске.

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

локальный: 8888 / _ah / admin

как указано в этом вопросе

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

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

  • ключ файла - aglub19hcHBfaWRyJwsSF19haF9GYWtlQ2xvdWRTdG9yYWdlX18xIgpxcmNvZGUuanBnDA
  • ID / имя закодировано_gs_key: L2dzLzEvcXJjb2RlLmpwZw
  • имя файла /gs/1/qrcode.jpg

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


person Michelantonio Trizio    schedule 17.06.2013    source источник
comment
Вы можете пояснить, о чем спрашиваете? Я не совсем понимаю, что вы ищете.   -  person jterrace    schedule 17.06.2013
comment
Может я не понимаю, как работает GCS. Когда я загружаю файл, я ожидаю, что он доступен по URL-адресу, предоставленному GCS. Это правильно? Я работал с облаком Rckspace, и оно работает именно так. Могу ли я получить доступ к моему файлу GCS только через приложение? Никто не может получить доступ к общедоступному URL-адресу?   -  person Michelantonio Trizio    schedule 18.06.2013
comment
@MichelantonioTrizio Sei riuscito alla fine a system il проблема col GCS? Вы исправили свой проект, потому что я делаю то же самое? Спасибо :-)   -  person Aerox    schedule 19.04.2014
comment
Вы должны разработать сервис для звонков, как вы можете видеть по ссылке ниже. Нет прямого доступа к ресурсам.   -  person Michelantonio Trizio    schedule 19.04.2014


Ответы (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, чтобы получить данные.

person tkaitchuck    schedule 18.06.2013

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

Локальный файл gcs сохраняется в формате 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. Надеюсь, этот ответ может помочь другим, кто в этом нуждается.)

Ресурс: ImagesServiceFactory ImageService FileServiceFactory

person RobinBattle    schedule 09.09.2014
comment
Точно, он хранится в Entity GsFileInfo, используя все содержимое столбца с именем ID / Name. - person drindt; 05.11.2014

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

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);
  }

}

и в вашем web.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-адрес для доступа к файлу GCS с сегментом bucket-name и именем fileName будет http://localhost:8181:/gcs/bucket-name/fileName, а номер порта локального сервера разработки GAE - 8181.

Это работает по крайней мере с GAE v1.9.50.

И если вы хотите, чтобы локальный сервер GCS работал в модульном тесте с 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();
person Édouard Mercier    schedule 04.11.2017