【发布时间】:2016-02-11 05:18:15
【问题描述】:
我在上传到谷歌云存储的图像文件上创建了一个 imageServing url,使用:
String key = "/gs/<bucket-name>/<path>";
ImagesService imagesService = ImagesServiceFactory.getImagesService();
ServingUrlOptions options = ServingUrlOptions.Builder
.withGoogleStorageFileName(key)
.imageSize(900) // Optional.
.crop(true); // Optional.
String servingUrl = imagesService.getServingUrl(options);
但似乎没有删除此网址的方法。 可用的方法“deleteServingUrl”接受我不使用的 blobKey。
这是否意味着我不需要删除 servingUrl ?
///////编辑
将 Appengine 与 objectify 一起使用。 创建了一个 servlet,UserImageEndpoint 在 web.xml 中将其定义为:
<servlet>
<servlet-name>UserImageEndpoint</servlet-name>
<servlet-class>reach.backend.Servlets.UserImageEndpoint</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserImageEndpoint</servlet-name>
<url-pattern>/userImageEndpoint</url-pattern>
</servlet-mapping>
Servlet 类:
public class UserImageEndpoint extends HttpServlet {
private static final Logger logger = Logger.getLogger(UserImageEndpoint.class.getName());
private static final String BUCKET_NAME_IMAGE = "xxxx-yyyy";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//
//
//
GcsFilename gcsFilename = new GcsFilename(BUCKET_NAME_IMAGE, actualImageId);
GcsService gcsService = GcsServiceFactory.createGcsService();
//this works, I get the meta-data, hence I am able to access
logger.info(gcsService.getMetadata(gcsFilename).toString());
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKey = blobstoreService.createGsBlobKey(
"/gs/" + gcsFilename.getBucketName() + "/" + gcsFilename.getObjectName());
logger.info("Requesting fileName - " + blobKey.getKeyString());
servingURL = ImagesServiceFactory.getImagesService().getServingUrl(
ServingUrlOptions.Builder.withBlobKey(blobKey));
最后一行崩溃:
java.lang.IllegalArgumentException: ACCESS_DENIED: 在 com.google.appengine.api.images.ImagesServiceImpl.getServingUrl(ImagesServiceImpl.java:282)
//////编辑 玲没有。 282 似乎是方法 deleteServingUrl(BlobKey blobKey),我现在什至没有调用它...
【问题讨论】:
-
lmgtfy:无论您将图像存储在 Blobstore 还是 Google Cloud Storage 中,阻止图像通过服务 URL 公开访问的正确方法是调用 deleteServingUrl() 方法。如果您只是从 Blobstore 或 Google Cloud Storage 中删除底层存储的图像,则在某些情况下,图像可能仍可通过服务 URL 访问。(来源:cloud.google.com/appengine/docs/java/images/…)
-
但我没有 blobKey,因为我使用的是“withGoogleStorageFileName”
-
BlobKey blobKey = blobstoreService.createGsBlobKey( "/gs/" + fileName.getBucketName() + "/" + fileName.getObjectName());(来源:cloud.google.com/appengine/docs/java/blobstore/…) -
@konqi 嘿,虽然我可以使用“GcsService”访问该文件,但我在使用它时收到了 ACCESS_DENIED。
-
请提供您目前拥有的代码。另请注意cloud.google.com/appengine/docs/java/images 中的重要部分。
标签: java google-app-engine google-cloud-storage