summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/utils/text.py6
-rw-r--r--tests/regressiontests/file_uploads/tests.py27
-rw-r--r--tests/regressiontests/file_uploads/urls.py1
-rw-r--r--tests/regressiontests/file_uploads/views.py31
4 files changed, 51 insertions, 14 deletions
diff --git a/django/utils/text.py b/django/utils/text.py
index 147fab4038..8bc256e804 100644
--- a/django/utils/text.py
+++ b/django/utils/text.py
@@ -116,13 +116,13 @@ def get_valid_filename(s):
"""
Returns the given string converted to a string that can be used for a clean
filename. Specifically, leading and trailing spaces are removed; other
- spaces are converted to underscores; and all non-filename-safe characters
- are removed.
+ spaces are converted to underscores; and anything that is not a unicode
+ alphanumeric, dash, underscore, or dot, is removed.
>>> get_valid_filename("john's portrait in 2004.jpg")
u'johns_portrait_in_2004.jpg'
"""
s = force_unicode(s).strip().replace(' ', '_')
- return re.sub(r'[^-A-Za-z0-9_.]', '', s)
+ return re.sub(r'(?u)[^-\w.]', '', s)
get_valid_filename = allow_lazy(get_valid_filename, unicode)
def get_text_list(list_, last_word=ugettext_lazy(u'or')):
diff --git a/tests/regressiontests/file_uploads/tests.py b/tests/regressiontests/file_uploads/tests.py
index 21f8ad4de2..ceea027f3c 100644
--- a/tests/regressiontests/file_uploads/tests.py
+++ b/tests/regressiontests/file_uploads/tests.py
@@ -1,3 +1,4 @@
+#! -*- coding: utf-8 -*-
import os
import errno
import shutil
@@ -12,6 +13,8 @@ from django.utils.hashcompat import sha_constructor
from models import FileModel, temp_storage, UPLOAD_TO
import uploadhandler
+UNICODE_FILENAME = u'test-0123456789_中文_Orléans.jpg'
+
class FileUploadTests(TestCase):
def test_simple_upload(self):
post_data = {
@@ -32,16 +35,10 @@ class FileUploadTests(TestCase):
file2.write('a' * (10 * 2 ** 20))
file2.seek(0)
- # This file contains chinese symbols for a name.
- file3 = open(os.path.join(tdir, u'test_中文_Orl\u00e9ans.jpg'.encode('utf-8')), 'w+b')
- file3.write('b' * (2 ** 10))
- file3.seek(0)
-
post_data = {
'name': 'Ringo',
'file_field1': open(file1.name),
'file_field2': open(file2.name),
- 'file_unicode': file3,
}
for key in post_data.keys():
@@ -53,8 +50,24 @@ class FileUploadTests(TestCase):
response = self.client.post('/file_uploads/verify/', post_data)
+ self.assertEqual(response.status_code, 200)
+
+ def test_unicode_file_name(self):
+ tdir = tempfile.gettempdir()
+
+ # This file contains chinese symbols and an accented char in the name.
+ file1 = open(os.path.join(tdir, UNICODE_FILENAME.encode('utf-8')), 'w+b')
+ file1.write('b' * (2 ** 10))
+ file1.seek(0)
+
+ post_data = {
+ 'file_unicode': file1,
+ }
+
+ response = self.client.post('/file_uploads/unicode_name/', post_data)
+
try:
- os.unlink(file3.name)
+ os.unlink(file1.name)
except:
pass
diff --git a/tests/regressiontests/file_uploads/urls.py b/tests/regressiontests/file_uploads/urls.py
index 607e1d1034..413080eb4f 100644
--- a/tests/regressiontests/file_uploads/urls.py
+++ b/tests/regressiontests/file_uploads/urls.py
@@ -4,6 +4,7 @@ import views
urlpatterns = patterns('',
(r'^upload/$', views.file_upload_view),
(r'^verify/$', views.file_upload_view_verify),
+ (r'^unicode_name/$', views.file_upload_unicode_name),
(r'^echo/$', views.file_upload_echo),
(r'^quota/$', views.file_upload_quota),
(r'^quota/broken/$', views.file_upload_quota_broken),
diff --git a/tests/regressiontests/file_uploads/views.py b/tests/regressiontests/file_uploads/views.py
index a989069a30..a2053a936a 100644
--- a/tests/regressiontests/file_uploads/views.py
+++ b/tests/regressiontests/file_uploads/views.py
@@ -5,6 +5,7 @@ from django.utils import simplejson
from models import FileModel
from uploadhandler import QuotaUploadHandler, ErroringUploadHandler
from django.utils.hashcompat import sha_constructor
+from tests import UNICODE_FILENAME
def file_upload_view(request):
"""
@@ -29,10 +30,6 @@ def file_upload_view_verify(request):
form_data = request.POST.copy()
form_data.update(request.FILES)
- # Check to see if unicode names worked out.
- if not request.FILES['file_unicode'].name.endswith(u'test_\u4e2d\u6587_Orl\xe9ans.jpg'):
- return HttpResponseServerError()
-
for key, value in form_data.items():
if key.endswith('_hash'):
continue
@@ -53,6 +50,32 @@ def file_upload_view_verify(request):
return HttpResponse('')
+def file_upload_unicode_name(request):
+
+ # Check to see if unicode name came through properly.
+ if not request.FILES['file_unicode'].name.endswith(UNICODE_FILENAME):
+ return HttpResponseServerError()
+
+ response = None
+
+ # Check to make sure the exotic characters are preserved even
+ # through file save.
+ uni_named_file = request.FILES['file_unicode']
+ obj = FileModel.objects.create(testfile=uni_named_file)
+ if not obj.testfile.name.endswith(uni_named_file.name):
+ response = HttpResponseServerError()
+
+ # Cleanup the object with its exotic file name immediately.
+ # (shutil.rmtree used elsewhere in the tests to clean up the
+ # upload directory has been seen to choke on unicode
+ # filenames on Windows.)
+ obj.delete()
+
+ if response:
+ return response
+ else:
+ return HttpResponse('')
+
def file_upload_echo(request):
"""
Simple view to echo back info about uploaded files for tests.