哪些是GAE java上的文件uri使用GCS客户端库模拟云存储?

时间:2013-06-17 07:02:31

标签: google-app-engine google-cloud-storage google-eclipse-plugin

我正在使用适用于Java的Google应用引擎开发一个Web应用程序。 我将使用Google云存储,根据documentation,我正在使用GCS客户端库来模拟本地磁盘上的云存储。

我没有保存文件的问题,我可以在war文件夹下的eclipse下看到它们(在WEB-INF / appengine生成的路径下),我可以从网址管理面板上看到它们从网址

  

本地主机:8888 / _ah /管理

如此question

所示

我的问题如下。哪个是localhost下的文件URI,可以通过GCS仿真访问它们?

localhost上传文件之一的示例:

  • 文件密钥为aglub19hcHBfaWRyJwsSF19haF9GYWtlQ2xvdWRTdG9yYWdlX18xIgpxcmNvZGUuanBnDA
  • ID / name是encoded_gs_key:L2dzLzEvcXJjb2RlLmpwZw
  • filename是/gs/1/qrcode.jpg

提前致谢。

3 个答案:

答案 0 :(得分: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客户端提供的更高级别类之一来获取数据。

答案 1 :(得分:3)

使用getServingUrl()

本地gcs文件保存为blob格式。 保存时,我可以像文件名“/gs/1/qrcode.jpg”一样使用位置 然而,当访问它时,这个假位置不起作用。 我找到了一个方法。它可能不是最好的,但对我有用。

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

网址将如下:

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

(我很难找到谷歌搜索的任何直接解决方案。 我希望这个答案可以帮助其他有需要的人。)

资源:ImagesServiceFactory ImageService FileServiceFactory

答案 2 :(得分:0)

对于那些希望提供由GAE GCS库创建的本地GCS文件的人来说,一种解决方案是公开这样的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);
  }

}

并在您的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应用程序中托管此servlet,则访问带有存储桶bucket-name且名称为fileName的GCS文件的URL为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();