如何将Web图像保存到App Engine的blobstore?

时间:2011-03-20 17:20:07

标签: python image google-app-engine blobstore tipfy

我使用this question作为模板来解决同样的问题,但我在发帖时遇到了问题。我有这些组件:

  1. HTML 表单,其中包含图片网址的文本框。这张贴到......
  2. 处理程序,它会获取已发布的网址,对其进行编码,并使用urlfetch将其再次发布到...
  3. 执行实际保存的单独的文件上传处理程序
  4. 如果我使用文件输入,组件#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。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

您可以在不使用blobstore api的情况下实现相同目的。我想你必须使用urlfetch()。content方法获取url并获取内容并将其存储为blob属性。

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

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

您可以在store-images-in-datastore

上查看此帖子了解更多信息

答案 1 :(得分:3)

您不能只将图像作为blobstore HTTP请求的有效负载包含在内,并希望它能够理解如何处理它。 blobstore需要application/multipart-form-data类型的消息,这是上传到blobstore时浏览器提供的消息。有一个库可以为您here执行此操作。

SDK的未来版本将包括以编程方式在blobstore中存储blob的功能,这样就不需要这种讨厌的黑客攻击。

如果您的图片尺寸小于1MB,则更简单的解决方案是将图像直接存储在数据存储区中,正如Abdul在答案中所建议的那样。