Для тех, кто желает обслуживать местные ГКС файлы, которые были созданы с помощью библиотеки 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();
Можете ли вы уточнить, что вы спрашиваете? Я не совсем понимаю, что вы ищете. – jterrace
Возможно, я не понимаю, как работает GCS. Когда я загружаю файл, я ожидаю, что он достигнет URL-адреса, предоставленного GCS. Это правильно? Я работал с облаком rackspace и работает таким образом. Могу ли я получить доступ к моему файлу GCS только через мое приложение? Разве нет публичного URL-адреса, доступного кому-либо? –
@MichelantonioTrizio Sei riuscito alla fine a sistemare il problema col GCS? Вы исправили свой проект, потому что я делаю то же самое. Спасибо :-) – Aerox