#8586: ImageFieldFile cannot be saved with File.read()
----------------------------------+-----------------------------------------
 Reporter:  rokclimb15            |       Owner:  nobody    
   Status:  new                   |   Milestone:            
Component:  File uploads/storage  |     Version:  SVN       
 Keywords:                        |       Stage:  Unreviewed
Has_patch:  0                     |  
----------------------------------+-----------------------------------------
 Both of these forms of data are rejected by get_image_dimensions, but
 accepted by !FieldFile.save().  If you use an object with attr read, like
 get_image_dimensions wants, it is rejected by the default file storage
 since it doesn't have a chunk method.  This is very useful if you want to
 duplicate an image behind the scenes for manipulation.

 This may be related to #8208, since it is making this call before the
 image data has been written to the filesystem.  It may need to be called
 after the ancestor save to get the proper filename (and fix #8208).

 Traceback:
 {{{
 File "/usr/lib/python2.5/site-packages/django/core/handlers/base.py" in
 get_response
   86.                 response = callback(request, *callback_args,
 **callback_kwargs)
 File "/usr/lib/python2.5/site-packages/django/contrib/admin/sites.py" in
 root
   173.                 return self.model_page(request, *url.split('/', 2))
 File "/usr/lib/python2.5/site-packages/django/views/decorators/cache.py"
 in _wrapped_view_func
   44.         response = view_func(request, *args, **kwargs)
 File "/usr/lib/python2.5/site-packages/django/contrib/admin/sites.py" in
 model_page
   192.         return admin_obj(request, rest_of_url)
 File "/usr/lib/python2.5/site-packages/django/contrib/admin/options.py" in
 __call__
   191.             return self.change_view(request, unquote(url))
 File "/usr/lib/python2.5/site-packages/django/db/transaction.py" in
 _commit_on_success
   238.                 res = func(*args, **kw)
 File "/usr/lib/python2.5/site-packages/django/contrib/admin/options.py" in
 change_view
   570.                 self.save_model(request, new_object, form,
 change=True)
 File "/usr/lib/python2.5/site-packages/django/contrib/admin/options.py" in
 save_model
   367.         obj.save()
 File "/media/MORTON USB/sites/btevents/../btevents/photos/models.py" in
 save
   19.
 self.slideshow_image.save(os_path.basename(self.image.path),
 self.image.read(), save=False)
 File "/usr/lib/python2.5/site-packages/django/db/models/fields/files.py"
 in save
   262.         self._dimensions_cache = get_image_dimensions(content)
 File "/usr/lib/python2.5/site-packages/django/core/files/images.py" in
 get_image_dimensions
   34.         file = open(file_or_path, 'rb')

 Exception Type: TypeError at /admin/photos/photo/9/
 Exception Value: file() argument 1 must be (encoded string without NULL
 bytes), not str
 }}}

 Here is a snippet to reproduce the problem.
 {{{
 class Photo(models.Model):
     image = models.ImageField(upload_to='event_photos')
     slideshow_image = models.ImageField(upload_to='slideshow',
 editable=False)

     def save(self):
         # save a stub image to get the filename we want from the
 FileStorage object
         self.slideshow_image.save(os.path.basename(self.image.path),
 self.image.read(), save=False)
         i = Image.open(self.slideshow_image.path)
         image = i.crop((0, 0, 450, 300))
         image.save(self.slideshow_image.path, 'JPEG')
         super(Photo, self).save()
 }}}

-- 
Ticket URL: <http://code.djangoproject.com/ticket/8586>
Django Code <http://code.djangoproject.com/>
The web framework for perfectionists with deadlines
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" 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/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to