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

mas*_*_99 7 java google-app-engine file-upload file 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);
Run Code Online (Sandbox Code Playgroud)

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

第一.我不想调用第二个HttpServlet.

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

谷歌说:

不推荐使用:此处用于将文件写入Blobstore的文件API功能将在将来的某个时间删除,有利于将文件写入Google云端存储并使用Blobstore为其提供服务.

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

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

Bret Slatkin指出,当API制作用于上传文件的POST URL时,它会创建一个唯一的一次性URL,以减轻任何可能的嗅探.

这非常适合用于呈现用户提交的Web表单的情况.但是,如果您尝试提供允许上传文件的REST API(例如,想想像TwitPic这样的东西)会让事情变得更难.在这种情况下,您将必须编写自己的渲染,模拟Web表单将执行的操作(获取文件,创建随机POST URL,调用它,...)

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

Fai*_*sal 3

我认为你最好的并且将得到官方支持的选择是 Google Cloud Storage Client Library,https://developers.google.com/appengine/docs/java/googlecloudstorageclient/看起来他们将不再支持以编程方式写入 blobstore可能是为了促进云存储在 blobstore 上的使用。图像和 blobstore api 在 GCS 上工作,用于创建和存储 blobstore 密钥以及生成图像 url/调整大小等。

我没有深入研究的另一种非官方方法是复制 Files Api 源并自己维护它,它可能使用不会消失或始终可用的 rpc 调用,但我不确切知道。

  • 抱歉,但这不是解决方案。这是另一种技术...那么你也可以建议亚马逊s3。Blobstore 更便宜并且足以满足我的工作流程,这就是我想使用它的原因。 (2认同)
  • 这项技术实际上与 blobtstores api 和应用程序引擎紧密集成。此外,定价比 s3 和 blobstore 本身便宜,只要超过免费 5GB 限制,您将比 blobstore 和 cloudstorage 支付更多费用,并且它具有内置的类似 CDN 的功能,因此它会在边缘服务器上自动缓存。 (2认同)