@Robert.  Right you are.  I checked the docs and db.get is a magic get
anything function.  Sorry for the noise.

So I'm going for door #2 now.  In ServePhoto "photo" must be the
correctly returned key.  Otherwise accessing "photo.photo" would give
an error.  So photo.photo must truly be a false value.  This means to
me that although "photo" is a valid object, the photo.photo property
never got set properly.  This takes us back to "UploadPhoto".  It's
unlikely that photo.put() failed.   And it's likely that "db.Blob"
created a valid db.Blob object.  However accessing "photo.photo"
doesn't return the db.Blob object, but rather the underlying data that
came into it.  Therefore I think your original hunch that the incoming
data for db.Blob is an empty string is correct.  I've struggled with
multi-part posts so I'm not 100% sure about the html.  One thing that
looks suspicious is the hard coding of the hostname:port in the post
action.  Are you sure you don't want simply "/uploadphoto"?   That
could send the uploads to the wrong place, for example different ports
use different datastores on the Dev Server.

On Sep 14, 9:17 am, Robert Kluin <[email protected]> wrote:
> db.get() will grab an entity of _any_ kind.  Model.get checks that the
> key is for the correct kind of entity before fetching it.  Either will
> work.  When I use db.get I usually include a check to make sure the
> keys are the correct kind.
>
> The key he posted in his initial thread is a Photo.
>
> Robert
>
> On Tue, Sep 14, 2010 at 11:34, John McLaughlin
>
>
>
> <[email protected]> wrote:
> > The one thing that looked off to me is that the line in ServePhoto
>
> >     photo = db.get(self.request.get("photo_id"))
>
> > might want to be
>
> >     photo = Photo.get(self.request.get("photo_id"))
>
> > I think db.get is a datastore method, not an inherited method from
> > db.Model
>
> > On Sep 13, 8:09 pm, Robert Kluin <[email protected]> wrote:
> >> I glanced over your code, nothing really major jumped out at me.  If
> >> you are not getting an exception in ServePhoto then the model is
> >> clearly getting created and successfully fetched.
>
> >> So, here are my first thoughts:
> >> Have you tried logging some debug info in the UploadPhoto and
> >> ServePhoto handlers?    Specifically are you sure data is actually in
> >> the photo property and it is not just an empty string or something?
> >> Maybe you could try logging len(photo.photo) right before saving it,
> >> then again right after fetching it.
>
> >> What happens when you remove the if and simply return photo.photo?
>
> >> Robert
>
> >> class ServePhoto (webapp.RequestHandler):
> >>    def get(self):
> >>      photo = db.get(self.request.get("photo_id"))
> >>      if photo.photo:
> >>          self.response.headers['Content-Type'] = "image/jpg"
> >>          self.response.out.write(photo.photo)
> >>      else:
> >>          self.error(404)
>
> >> ------
> >> Robert Kluin
> >> Ezox Systems, LLC
>
> >> On Sun, Sep 12, 2010 at 22:03, Raymond
>
> >> <[email protected]> wrote:
> >> > Hi All,
>
> >> > I have been trying to understand how to upload and download images
> >> > from to a Blobstore and have hit a wall.
> >> > I have essentially made a modified version of the Guestbook example
> >> > provided by google and modified it to suit my needs, I have tested the
> >> > guestbook app as is and got it working, somehow somewhere I am making
> >> > a simple mistake that frustrate every attempt at getting it working in
> >> > my own code.
> >> > I have stripped down my code to the essential in the hope of
> >> > understanding what is wrong, but I am still stuck.
>
> >> > What am I attempting to do ?
> >> > Upload in a blobstore an image and display it in a web page.
>
> >> > What is my code ?
>
> >> > 1) My upload form served from a static page
>
> >> > ...
> >> > <form action="http://192.168.0.196:8083/uploadphoto";
> >> > enctype="multipart/form-data" method="post">
> >> >        <div><label>Attempt at uploading a picture using a form</label></
> >> > deiv>
> >> >        <div><input type="file" name="photo" /></div>
> >> >        <div><input type="submit" value="Upload Photo" /></div>
> >> > </form>
> >> > ...
>
> >> > 2) My db model :
>
> >> > class Photo(db.Model):
> >> >        photo = db.BlobProperty()
> >> >        date = db.DateTimeProperty(auto_now_add=True)
>
> >> > 3) The code uploading the photo and saving it in the blobstore
>
> >> > class UploadPhoto(webapp.RequestHandler):
> >> >        def post(self):
> >> >                photo = Photo()
> >> >                img = self.request.get('photo')
> >> >                photo.photo = db.Blob(img)
> >> >                photo.put()
>
> >> > 4) The code creating the web page displaying the images :
>
> >> > class PhotoPage(webapp.RequestHandler):
> >> >        def get(self):
> >> >                self.response.out.write('<html><pre>')
> >> >                self.response.out.write('<h1>Date&Time  Photo</h1>')
> >> >                photos = db.GqlQuery("SELECT * FROM Photo ORDER BY date 
> >> > DESC LIMIT
> >> > 10")
> >> >                for photo in photos:
> >> >                        self.response.out.write('<p>%s  ' % photo.date)
> >> >                        self.response.out.write('<img 
> >> > src="servephoto?photo_id=%s" /></p>'
> >> > % photo.key())
> >> >                self.response.out.write('</pre></body></html>')
>
> >> > 5) The code serving the images :
>
> >> > class ServePhoto (webapp.RequestHandler):
> >> >    def get(self):
> >> >      photo = db.get(self.request.get("photo_id"))
> >> >      if photo.photo:
> >> >          self.response.headers['Content-Type'] = "image/jpg"
> >> >          self.response.out.write(photo.photo)
> >> >      else:
> >> >          self.error(404)
>
> >> > Everything seem to work until this last stage, I can select an image
> >> > in my form, upload it, Something is written in Binary in the
> >> > Blobstore.
> >> > When I visit the page supposed to display the image I see all info but
> >> > a broken image icon.
> >> > I checked the source code and the HTML seem to be just fine, here it
> >> > is with one record in the blobstore, I get the blob key which mena
> >> > that there is a record with some binary stuff in it.
>
> >> > <html><pre><h1>Date&Time        Photo</h1><p>2010-09-13 00:31:14.477698 
> >> > <img
> >> > src="servephoto?photo_id=agt0ZXN0cmF5c3Bvc3ILCxIFUGhvdG8YWww" /></p></
> >> > pre></body></html>
>
> >> > I also know that the ServePhoto class is called and executed but it if
> >> > photo.photo always return false and execute self-eror(404).
> >> > I tried replacing this with a different error code and it always
> >> > display the error code so I am sure the if statement get a false.
>
> >> > My questions is, why would the if statement get a false if there is
> >> > effectively an image in the blobstore (Proved by the fact that I can
> >> > retrieve it's key) ?
>
> >> > I am sorry for the long post, and hope I am not too confusing.
>
> >> > Thanks for any hint that would get me on the right way and forgive me
> >> > if the answer is obvious, I probably need new eyes.
>
> >> > Raymond
>
> >> > --
> >> > You received this message because you are subscribed to the Google 
> >> > Groups "Google App Engine" group.
> >> > To post to this group, send email to [email protected].
> >> > To unsubscribe from this group, send email to 
> >> > [email protected].
> >> > For more options, visit this group 
> >> > athttp://groups.google.com/group/google-appengine?hl=en.
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "Google App Engine" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to 
> > [email protected].
> > For more options, visit this group 
> > athttp://groups.google.com/group/google-appengine?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.

Reply via email to