Appengine 图片服务 URL,deleteServingUrl 问题
Appengine Image serving URL, deleteServingUrl issue
我在上传到 Google 云存储的图像文件上创建一个 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);
但是好像没有办法删除这个url。
可用方法 "deleteServingUrl" 接受我不使用的 blobKey。
这是否意味着我不需要删除 servingUrl?
///////EDIT
将 Appengine 与对象化结合使用。
创建了一个 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 class :
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: at
com.google.appengine.api.images.ImagesServiceImpl.getServingUrl(ImagesServiceImpl.java:282)
//////EDIT
Ling no. 282 seems to be the method deleteServingUrl(BlobKey blobKey), which I am not even calling right now...
正如@konqi 指出的那样,文档中的重要部分指出,如果文件已经public仅通过云存储可用(cloud.google.com/appengine/docs/java/images)
我遇到了完全相同的问题,但通过在尝试使用 Blobstore API 创建服务 url 之前不在云存储中将 ACL 设置为 public 解决了这个问题。
我在上传到 Google 云存储的图像文件上创建一个 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);
但是好像没有办法删除这个url。 可用方法 "deleteServingUrl" 接受我不使用的 blobKey。
这是否意味着我不需要删除 servingUrl?
///////EDIT
将 Appengine 与对象化结合使用。 创建了一个 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 class :
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: at com.google.appengine.api.images.ImagesServiceImpl.getServingUrl(ImagesServiceImpl.java:282)
//////EDIT Ling no. 282 seems to be the method deleteServingUrl(BlobKey blobKey), which I am not even calling right now...
正如@konqi 指出的那样,文档中的重要部分指出,如果文件已经public仅通过云存储可用(cloud.google.com/appengine/docs/java/images)
我遇到了完全相同的问题,但通过在尝试使用 Blobstore API 创建服务 url 之前不在云存储中将 ACL 设置为 public 解决了这个问题。