#8421: FileField traps error when uploading non-ascii filename
---------------------------------+------------------------------------------
          Reporter:  mizutori    |         Owner:  nobody                
            Status:  new         |     Milestone:  1.0                   
         Component:  Forms       |       Version:  1.0-beta-1            
        Resolution:              |      Keywords:  FileField upload files
             Stage:  Unreviewed  |     Has_patch:  0                     
        Needs_docs:  0           |   Needs_tests:  0                     
Needs_better_patch:  0           |  
---------------------------------+------------------------------------------
Old description:

> Uploading non-ascii filename causes error by UnicodeEncodeError.
>
> If the form has two (or more) input fields for uploading files,
> and if you fill in either field by non-ascii filename and the other
> field empty, then an UnicodeEncodeError occurs when is_valid() is
> invoked.
>
> To the contrary, no error occurs when
> (1) the form has only one input field and fill it by non-ascii filename,
> (2) or the form has two (or more) input fields and fill them all by
> filenames.
> (3) or fill one or more input field(s) by ascii filename(s)
>
> I wonder why the error occurs only on condition that
> (4) the form has two (or more) input fields and one field is filled by
> non-ascii filename and the other field(s) is/are kept empty.
>

> [1] source code
>
> ---[ views.py ]---
> class UploadForm(forms.Form):
>   attach_1 = forms.FileField(required = False)
>   attach_2 = forms.FileField(required = False)
>
> def test_upload(self,request):
>   if request.method == 'POST':
>     formup = UploadForm(request.POST,request.FILES)
>     if formup.is_valid():
>       result = self.handle_uploaded_file(request.FILES)
>       return HttpResponseRedirect('result.html')
> ---
> * the form page is encoded in UTF-8.
>
> [2] error message
>
> UnicodeEncodeError at /mysite1/debug/upload.html
> 'ascii' codec can't encode characters in position 37-39: ordinal not in
> range(128)
>
> Unicode error hint
> The string that could not be encoded/decoded was: NON-ASCII-UPLOAD-
> FILENAME
>
> [3] traceback message
>
> Traceback:
> File "/usr/lib/python25/Lib/site-packages/django/core/handlers/base.py"
> in get_response
>  86. response = callback(request, *callback_args, **callback_kwargs)
> File "/mysite1/debug/views.py" in upload
>  70. return MyDebug.toolbox.test_upload(request)
> File "/mysite1/debug/util_mysite_debug.py" in test_upload
>  177. if formup.is_valid():
> File "/usr/lib/python25/Lib/site-packages/django/forms/forms.py" in
> is_valid
>  120. return self.is_bound and not bool(self.errors)
> File "/usr/lib/python25/Lib/site-packages/django/forms/forms.py" in
> _get_errors
>  111. self.full_clean()
> File "/usr/lib/python25/Lib/site-packages/django/forms/forms.py" in
> full_clean
>  212. value = field.widget.value_from_datadict(self.data, self.files,
> self.add_prefix(name))
> File "/usr/lib/python25/Lib/site-packages/django/forms/widgets.py" in
> value_from_datadict
>  266. return files.get(name, None)
> File "/usr/lib/python25/Lib/site-packages/django/utils/datastructures.py"
> in get
>  227. val = self[key]
> File "/usr/lib/python25/Lib/site-packages/django/utils/datastructures.py"
> in __getitem__
>  198. raise MultiValueDictKeyError, "Key %r not found in %r" % (key,
> self)
> File "/usr/lib/python25/Lib/site-packages/django/utils/datastructures.py"
> in __repr__
>  188. super(MultiValueDict, self).__repr__())
>
> Exception Type: UnicodeEncodeError at /mysite1/debug/upload.html
> Exception Value: 'ascii' codec can't encode characters in position 37-39:
> ordinal not in range(128)

New description:

 Uploading non-ascii filename causes error by UnicodeEncodeError.

 If the form has two (or more) input fields for uploading files,
 and if you fill in either field by non-ascii filename and the other
 field empty, then an UnicodeEncodeError occurs when is_valid() is invoked.

 To the contrary, no error occurs when
 (1) the form has only one input field and fill it by non-ascii filename,
 (2) or the form has two (or more) input fields and fill them all by
 filenames.
 (3) or fill one or more input field(s) by ascii filename(s)

 I wonder why the error occurs only on condition that
 (4) the form has two (or more) input fields and one field is filled by
 non-ascii filename and the other field(s) is/are kept empty.


 [1] source code

 {{{
 ---[ views.py ]---
 class UploadForm(forms.Form):
   attach_1 = forms.FileField(required = False)
   attach_2 = forms.FileField(required = False)

 def test_upload(self,request):
   if request.method == 'POST':
     formup = UploadForm(request.POST,request.FILES)
     if formup.is_valid():
       result = self.handle_uploaded_file(request.FILES)
       return HttpResponseRedirect('result.html')
 ---
 * the form page is encoded in UTF-8.

 [2] error message

 UnicodeEncodeError at /mysite1/debug/upload.html
 'ascii' codec can't encode characters in position 37-39: ordinal not in
 range(128)

 Unicode error hint
 The string that could not be encoded/decoded was: NON-ASCII-UPLOAD-
 FILENAME

 [3] traceback message

 Traceback:
 File "/usr/lib/python25/Lib/site-packages/django/core/handlers/base.py" in
 get_response
  86. response = callback(request, *callback_args, **callback_kwargs)
 File "/mysite1/debug/views.py" in upload
  70. return MyDebug.toolbox.test_upload(request)
 File "/mysite1/debug/util_mysite_debug.py" in test_upload
  177. if formup.is_valid():
 File "/usr/lib/python25/Lib/site-packages/django/forms/forms.py" in
 is_valid
  120. return self.is_bound and not bool(self.errors)
 File "/usr/lib/python25/Lib/site-packages/django/forms/forms.py" in
 _get_errors
  111. self.full_clean()
 File "/usr/lib/python25/Lib/site-packages/django/forms/forms.py" in
 full_clean
  212. value = field.widget.value_from_datadict(self.data, self.files,
 self.add_prefix(name))
 File "/usr/lib/python25/Lib/site-packages/django/forms/widgets.py" in
 value_from_datadict
  266. return files.get(name, None)
 File "/usr/lib/python25/Lib/site-packages/django/utils/datastructures.py"
 in get
  227. val = self[key]
 File "/usr/lib/python25/Lib/site-packages/django/utils/datastructures.py"
 in __getitem__
  198. raise MultiValueDictKeyError, "Key %r not found in %r" % (key, self)
 File "/usr/lib/python25/Lib/site-packages/django/utils/datastructures.py"
 in __repr__
  188. super(MultiValueDict, self).__repr__())

 Exception Type: UnicodeEncodeError at /mysite1/debug/upload.html
 Exception Value: 'ascii' codec can't encode characters in position 37-39:
 ordinal not in range(128)
 }}}

Comment (by jacob):

 (fixed formatting)

-- 
Ticket URL: <http://code.djangoproject.com/ticket/8421#comment:3>
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