错误
引起: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中存储图像?
答案 0 :(得分:3)
我认为你最好并且将得到官方支持的选择是谷歌云存储客户端库,https://developers.google.com/appengine/docs/java/googlecloudstorageclient/看起来他们不再支持以编程方式写入blobstore,这可能是为了促进在blobstore上使用云存储。 Image和blobstore api适用于GCS,用于创建和存储blobstore密钥以及生成图像url / resizing等。
我没有考虑过的其他非官方方式是复制Files Api源并自行维护,它可能使用的rpc调用不会消失或者总是可用,但我不确切知道。