Google App Engine Blobstore和Restlet - “必须从blob上传回调请求中调用”

时间:2013-08-04 11:05:15

标签: java file google-app-engine file-upload blobstore

错误

  

引起:java.lang.IllegalStateException:必须从blob中调用   上传回叫请求。在   com.google.appengine.api.blobstore.BlobstoreServiceImpl.getUploads(BlobstoreServiceImpl.java:169)

代码

public class UserUploadProfilePictureResource extends ServerResource {

    @Post
    public void handleBlobstoreUpload(Representation entity) {

        Representation rep =null;

        if (entity !=null) {

            if (MediaType.MULTIPART_FORM_DATA.equals(entity.getMediaType(), true)) {
                Request restletRequest = getRequest();
                HttpServletRequest servletRequest = ServletUtils.getRequest(restletRequest);

                BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();

                Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(servletRequest);

可能的解决方案(但我不想要的)

首先。我不想调用第二个HttpServlet。

二。关于这篇文章,有手动编写文件的解决方案:

谷歌说:

  

不推荐使用:此处使用的文件API功能可将文件写入   Blobstore将在未来的某个时间被删除,赞成   将文件写入Google云端存储并使用Blobstore进行服务   它们。

可能的解决方案2 (但只是解决方法的概念)

http://www.cloudave.com/1055/the-new-google-app-engine-blobstore-api-first-thoughts/

  

Bret Slatkin指出,当API制作POST URL时   用于上传文件,它创建一个唯一的一次性URL   这减轻了任何潜在的嗅探。

     

这非常适合渲染网络表单时的情况   由用户提交。但是,如果你这样做会让事情变得更难   试图提供允许上传文件的REST API(想想   像TwitPic这样的东西)。在这种情况下,你将不得不写   你自己的渲染,模拟网络表单会做什么(得到   文件,创建随机POST URL,调用它,...)

问题

在Google应用引擎中存储图片的最佳方法是什么?有没有比blobstore更好的方法?如何在blobstore中存储图像?

1 个答案:

答案 0 :(得分:3)

我认为你最好并且将得到官方支持的选择是谷歌云存储客户端库,https://developers.google.com/appengine/docs/java/googlecloudstorageclient/看起来他们不再支持以编程方式写入blobstore,这可能是为了促进在blobstore上使用云存储。 Image和blobstore api适用于GCS,用于创建和存储blobstore密钥以及生成图像url / resizing等。

我没有考虑过的其他非官方方式是复制Files Api源并自行维护,它可能使用的rpc调用不会消失或者总是可用,但我不确切知道。