So I thought the problem might go away if I changed the definition of the 
table to:

thumb_field = Field ("thumb", "upload", uploadfield = "thumb_data")

db.define_table ("images",
Field ("image", "upload", uploadfield = "image_data",
  requires = IS_IMAGE (extensions = ('bmp', 'gif', 'jpeg', 'jpg', 'png'),
  maxsize = (3048, 2400))),
Field ("image_data", "blob"),
thumb_field, #Field ("thumb", "upload", uploadfield = "thumb_data"),
Field ("thumb_data", "blob"),
)

I thought that that way store function code would see that the type of the 
field was uploadfield, but that failed, too, showing mostly that I don't 
understand the internals of how Field.store and Field.retrieve work for 
manually uploaded files that are stored in the database.

Is there something wrong with my original images table definition?

Would I be better served to simply store the image in a blob field and not 
use the store/retrieve functions?

Any help would gratefully received.

David


On Friday, October 26, 2012 1:27:09 PM UTC-5, David Phillips wrote:
>
> I am attempting to create and store a thumbnail image in a MySQL database. 
> The source image comes from the same record and has already been stored in 
> the database. When my code executes, the thumbnail name gets written to the 
> "thumb" field, but the "thumb_data" field is null. 
>
> My table is defined like this:
>
> db.define_table ("images",
> Field ("image", "upload", uploadfield = "image_data",
>   requires = IS_IMAGE (extensions = ('bmp', 'gif', 'jpeg', 'jpg', 'png'),
>   maxsize = (3048, 2400))),
> Field ("image_data", "blob"),
> Field ("thumb", "upload", uploadfield = "thumb_data"),
> Field ("thumb_data", "blob"),
> auth.signature,
> )
>
> My code does this:
>
> from cStringIO import StringIO
> from PIL import Image
>
> # Get the image
> images_rec = db (db.images.id == image_id).select().first()
> filename, stream = db.images.image.retrieve (images_rec.image)
>
> # Open the image in PIL and make a thumnail
> thumb_PIL = Image.open (stream)
> thumb_PIL.thumbnail ((thumb_width, thumb_height), Image.ANTIALIAS)
>
> # Create a file-like object and save the thumbnail to it.
> thumb_file = StringIO()
> thumb_PIL.save (thumb_file, "jpeg")
>
> # Store the thumbnail
> thumb_file.seek (0)
> upload_image_rec.update_record (thumb = db.images.thumb.store (thumb_file, 
> filename))
>
> I've traced through the store function code in gluon/dal.py and it looks 
> to me like the problem is here (line 8461 in version 2.0.8):
>
>         if isinstance(self_uploadfield,Field):
>             blob_uploadfield_name = self_uploadfield.uploadfield
>             keys={self_uploadfield.name: newfilename,
>                   blob_uploadfield_name: file.read()}
>             self_uploadfield.table.insert(**keys)
>
> self_uploadfield is of type "str" with a value of "thumb_data" and the 
> test  "isinstance(self_uploadfield,Field)" fails. But I've checked 
> carefully that the definition of the thumb and thumb_data fields follow the 
> examples in the manual. 
>
> I am confident that the image field is correct because I can retrieve and 
> display the image from it. I also believe that the thumbnail is being 
> created properly. At least, thumb_file.getvalue() returns a sensible 
> looking block of data.
>
> I am using web2py version 2.0.8 on MacOS 10.8. The database is hosted on 
> Amazon RDS.
>
> Thanks for any help you can give me.
>
>

-- 



Reply via email to