Tuesday, August 21, 2012

Re: issues with file upload

finished
sorry, I clone the new source( for review) but use an old source on python environment



在 2012年8月21日星期二UTC+8下午6时36分46秒,软刀写道:

I now  work with mongoengine, mongoForm
and set this in setting.py
DEFAULT_FILE_STORAGE = 'mongoengine.django.storage.GridFSStorage'

I need to upload a picture, and I wrote a form like this:
from django.forms import ImageField
          from mongoforms import MongoForm
          from documents import UserProfile
          
          class ProfileForm(MongoForm):
              photo = ImageField()
              class Meta:
                  document = UserProfile
                  exclude = ('user', 'photo')

but I get a Invalid Image Error when I submit a picture( how ever, it's ok when I use PIL.Image.open(photo).verify() )
I review the code, and found the exception was raise on django.forms.fields.ImageField.to_python method
code snippet for to_python method:
      def to_python(self, data):
           ....
           if hasattr(data, 'temporary_file_path'):
              file = data.temporary_file_path()
           ....
           try:
                Image.open(file).verify()
        except ImportError:
            raise
        except Exception: # Python Imaging Library doesn't recognize it as an image
            raise ValidationError(self.error_messages['invalid_image'])
        ...

       well, I don't know well to set temporary_file_path and how to storage it with mongoengine.django.storage.GridFSStorage


# this was snippet for class ImageField
    def to_python(self, data):
        """
        Checks that the file-upload field data contains a valid image (GIF, JPG,
        PNG, possibly others -- whatever the Python Imaging Library supports).
        """
        f = super(ImageField, self).to_python(data)
        if f is None:
            return None

        # Try to import PIL in either of the two ways it can end up installed.
        try:
            from PIL import Image
        except ImportError:
            import Image

        # We need to get a file object for PIL. We might have a path or we might
        # have to read the data into memory.
        if hasattr(data, 'temporary_file_path'):
            file = data.temporary_file_path()
        else:
            if hasattr(data, 'read'):
                file = StringIO(data.read())
            else:
                file = StringIO(data['content'])

        try:
            # load() could spot a truncated JPEG, but it loads the entire
            # image in memory, which is a DoS vector. See #3848 and #18520.
            # verify() must be called immediately after the constructor.
            Image.open(file).verify()
        except ImportError:
            # Under PyPy, it is possible to import PIL. However, the underlying
            # _imaging C module isn't available, so an ImportError will be
            # raised. Catch and re-raise.
            raise
        except Exception: # Python Imaging Library doesn't recognize it as an image
            raise ValidationError(self.error_messages['invalid_image'])
        if hasattr(f, 'seek') and callable(f.seek):
            f.seek(0)
        return f
 
 
this was exception stack
Environment:


Request Method: POST

Django Version: 1.4
Python Version: 2.7.3
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'registration',
 'bussiness',
 'accounts',
 'debug_toolbar']
Installed Middleware:
['django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware']


Traceback:
File "/home/yan/env/haoyoubang/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/yan/env/haoyoubang/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  20.                 return view_func(request, *args, **kwargs)
File "/home/yan/git/haoyoubang/accounts/views.py" in profile
  31.     processFile(request.FILES['photo'])
File "/home/yan/git/haoyoubang/accounts/views.py" in processFile
  21.     s = f.clean(photo)
File "/home/yan/env/haoyoubang/local/lib/python2.7/site-packages/django/forms/fields.py" in clean
  535.         return super(FileField, self).clean(data)
File "/home/yan/env/haoyoubang/local/lib/python2.7/site-packages/django/forms/fields.py" in clean
  153.         value = self.to_python(value)
File "/home/yan/env/haoyoubang/local/lib/python2.7/site-packages/django/forms/fields.py" in to_python
  593.             raise ValidationError(self.error_messages['invalid_image'])

Exception Type: ValidationError at /accounts/profile/
Exception Value: [u'\u8bf7\u4e0a\u4f20\u4e00\u5f20\u6709\u6548\u7684\u56fe\u7247\u3002\u60a8\u6240\u4e0a\u4f20\u7684\u6587\u4ef6\u4e0d\u662f\u56fe\u7247\u6216\u8005\u662f\u5df2\u635f\u574f\u7684\u56fe\u7247\u3002']




thank you !!

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To view this discussion on the web visit https://groups.google.com/d/msg/django-users/-/LQo7laGp4RUJ.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate