我正在使用适用于Java的Google应用引擎开发一个Web应用程序。 我将使用Google云存储,根据documentation,我正在使用GCS客户端库来模拟本地磁盘上的云存储。
我没有保存文件的问题,我可以在war文件夹下的eclipse下看到它们(在WEB-INF / appengine生成的路径下),我可以从网址管理面板上看到它们从网址
本地主机:8888 / _ah /管理
如此question
所示我的问题如下。哪个是localhost下的文件URI,可以通过GCS仿真访问它们?
localhost上传文件之一的示例:
提前致谢。
答案 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)
本地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
(我很难找到谷歌搜索的任何直接解决方案。 我希望这个答案可以帮助其他有需要的人。)
答案 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();