Skip to content

Commit f66d7dc

Browse files
authored
Add Non-ASCII filename support (#11)
* add non-ascii filename support * add Non-ASCII filename support section to docs * Add test for non-ascii filename
1 parent 6a68658 commit f66d7dc

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

docs/index.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,18 @@ The field itself should be an ``<input type=file>``.
151151
</form>
152152

153153

154+
Non-ASCII Filename Support
155+
==========================
156+
Flask-Uplaods use Werkzeug's ``secure_filename()`` to check filename, it will omit
157+
Non-ASCII string. When the filename is completely consist of Non-ASCII string,
158+
such as Chinese or Japanese, it will return empty filename like ``.jpg``. If your
159+
files may encounter a situation like this, you have to set it's name or generate
160+
random filename::
161+
162+
uset.save(file, name='photo_123.')
163+
# If name ends with a dot, the file's extension will be appended to the end.
164+
165+
154166
API Documentation
155167
=================
156168
This documentation is generated directly from the source code.

flask_uploads.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ def tuple_from(*iters):
100100

101101
def extension(filename):
102102
ext = os.path.splitext(filename)[1]
103+
if ext == '':
104+
# add non-ascii filename support
105+
ext = os.path.splitext(filename)[0]
103106
if ext.startswith('.'):
104107
# os.path.splitext retains . separator
105108
ext = ext[1:]

tests.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,15 @@ def test_filenames(self):
160160
tfs = TestingFileStorage(filename=name)
161161
assert uset.file_allowed(tfs, name) is result
162162

163+
def test_non_ascii_filename(self):
164+
uset = UploadSet('files')
165+
uset._config = Config('/uploads')
166+
tfs = TestingFileStorage(filename=u'天安门.jpg')
167+
res = uset.save(tfs)
168+
assert res == 'jpg'
169+
res = uset.save(tfs, name='secret.')
170+
assert res == 'secret.jpg'
171+
163172
def test_default_extensions(self):
164173
uset = UploadSet('files')
165174
uset._config = Config('/uploads')

0 commit comments

Comments
 (0)