Opened 16 years ago

Last modified 13 years ago

#8421 closed

FileField traps error when uploading non-ascii filename — at Initial Version

Reported by: mizutori Owned by: nobody
Component: Forms Version: 1.0-beta
Severity: Keywords: FileField upload files
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

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

  1. response = callback(request, *callback_args, callback_kwargs)

File "/mysite1/debug/views.py" in upload

  1. return MyDebug.toolbox.test_upload(request)

File "/mysite1/debug/util_mysite_debug.py" in test_upload

  1. if formup.is_valid():

File "/usr/lib/python25/Lib/site-packages/django/forms/forms.py" in is_valid

  1. return self.is_bound and not bool(self.errors)

File "/usr/lib/python25/Lib/site-packages/django/forms/forms.py" in _get_errors

  1. self.full_clean()

File "/usr/lib/python25/Lib/site-packages/django/forms/forms.py" in full_clean

  1. 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

  1. return files.get(name, None)

File "/usr/lib/python25/Lib/site-packages/django/utils/datastructures.py" in get

  1. val = self[key]

File "/usr/lib/python25/Lib/site-packages/django/utils/datastructures.py" in getitem

  1. raise MultiValueDictKeyError, "Key %r not found in %r" % (key, self)

File "/usr/lib/python25/Lib/site-packages/django/utils/datastructures.py" in repr

  1. 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)

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top