2011-03-20 98 views
1

我用this question作为模板来解决同样的问题,但是我在发帖时遇到了问题。我有这些组件:如何将Web图像保存到App Engine的blobstore?

  1. HTML 形式带有图像URL的文本框。这个职位,以...
  2. 一个处理,是以贴出网址,对其进行编码,并使用urlfetch再次发布它...
  3. 单独文件上传处理,做实际节能。

如果我使用文件输入,组件#3本身工作正常。但我不太明白如何从图片网址获得urlfetch的需求。我的流程要么超时,要么得到最终处理程序的500响应。

# 1 
class URLMainHandler(RequestHandler): 
    def get(self): 
     return render_response('blob/upload_url.html', 
           upload_url=url_for('blobstore/upload/url')) 
# 2   
class URLUploadHandler(RequestHandler): 
    def post(self): 
     import urllib 
     # Get the posted image URL. 
     data = urllib.urlencode({'file': self.request.form.get('file')}) 
     # Post image to blobstore by calling POST on the file upload handler. 
     result = urlfetch.fetch(url=blobstore.create_upload_url(url_for('blobstore/upload')), 
           payload=data, 
           method=urlfetch.POST) 

     return self.redirect(url_for('blobstore/url'), result.status_code) 

# 3 
class UploadHandler(RequestHandler, BlobstoreUploadMixin): 
    def post(self): 
     # 'file' is the name of the file upload field in the form. 
     upload_files = self.get_uploads('file') 
     blob_info = upload_files[0] 
     response = redirect_to('blobstore/serve', resource=blob_info.key()) 
     # Clear the response body. 
     response.data = '' 
     return response 

再次,this is the process I'm following。谢谢你的帮助!

+0

#2处理程序只有30秒来获取文件并将其上传到blobstore处理程序。 – systempuntoout 2011-03-20 21:00:18

回答

3

您可以在不使用blobstore api的情况下实现同样的功能。我认为你必须得到URL并使用urlfetch()。content方法获取内容并将其存储为blob属性。

url = "imageurl" 
result = urlfetch.fetch(url) 
if result.status_code == 200: 
    prof.avatar = db.Blob(result.content) 

有关作为blob存储和提供数据存储图像的进一步参考。

你可以看到这个帖子以获得更多关于store-images-in-datastore

+0

谢谢 - 这简单得多。我也发现这是一个很好的服务图片资源:http://code.google.com/appengine/articles/python/serving_dynamic_images.html – 2011-03-23 02:33:43

3

你不能只包括图像作为Blob存储区HTTP请求的有效负载,并期望它了解它做什么。 blobstore预计会有一个application/multipart-form-data类型的消息,这是浏览器在上传到Blobstore时提供的消息。有一个图书馆为你做这个here

SDK的未来版本将包括以编程方式在blobstore中存储blob的功能,该功能可以避免需要这种令人讨厌的黑客攻击。

但是,如果您的图像大小小于1MB,则更简单的解决方案是将图像直接存储在数据存储中,如Abdul在其答案中所示。

+0

谢谢,尼克。是否可以混合并匹配Blobstore,以便在上传图片后提供图片,以便您不必为每个模型制作自定义处理程序?一个例子是在这里http://stackoverflow.com/questions/4763715/tipfy-how-to-display-blob-in-template/4767873#4767873,但它不适合我。毕竟,BlobProperty没有密钥。 Blobstore中是否有一个功能可以弥合这个差距? – 2011-03-23 02:32:46

+1

@Wraith不,您只能使用Blobstore来提供存储在Blobstore中的图像。尽管如此,您可以创建一个模型来存储图像,并使用ReferenceProperty来引用来自其他模型的图像。 – 2011-03-23 03:03:09

+0

使用hack建议。给出这个国王的错误............. RequestTooLargeError:API调用file.Append()的请求太大。感谢这篇文章,我们希望相同的API访问将很快提供...... – 2011-08-13 10:57:08

相关问题