pythonimagegoogle-app-engineblobstoretipfy

How do I save web images to App Engine's blobstore?


I've used this question as a template to solve the same problem, but I'm running into issues when posting. I have these components:

  1. HTML form with a textbox for the image URL. This posts to...
  2. A handler that takes the posted URL, encodes it, and uses urlfetch to post it again to...
  3. A separate file upload handler that does the actual saving.

Component #3 works fine by itself if I use a file input. But I don't quite understand how to get urlfetch what it needs from just the image URL. My process either times out or gets a 500 response from the final handler.

# 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

Again, this is the process I'm following. Thanks for your help!


Solution

  • You can achieve the same without using blobstore api. I think you have to just get the url and get the content using urlfetch().content method and store it as a blob property.

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

    For further reference in storing and serving images from datastore as blob.

    You can see this post for more on store-images-in-datastore