7

错误

原因: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。

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

谷歌说如下:

已弃用:此处用于将文件写入 Blobstore 的 Files API 功能将在未来某个时间被移除,以支持将文件写入 Google Cloud Storage 并使用 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、调用它……)

问题

在谷歌应用引擎中存储图像的最佳方法是什么?有比 blobstore 更好的方法吗?如何将图像存储在 blobstore 中?

4

1 回答 1

3

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

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

于 2013-08-08T21:47:34.347 回答