Skip to content

Commit 8c76994

Browse files
howl-andersonchfw
authored andcommitted
Add support to unicode file name (#22)
* Add support to unicode file name * Update test case for support unicode file name * Modify code to fulfill the requirement of PEP8's maximum line length (79) limitation * Add unicode file name downloading example * Add test cases and reduce number of demo for supporting of unicode file name * Fix issue: W292 no newline at end of file
1 parent e1d67cc commit 8c76994

File tree

3 files changed

+57
-2
lines changed

3 files changed

+57
-2
lines changed

examples/tiny_example.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
"""
23
tiny_example.py
34
:copyright: (c) 2015 by C. W.
@@ -34,6 +35,12 @@ def export_records():
3435
file_name="export_data")
3536

3637

38+
@app.route("/download_file_named_in_unicode", methods=['GET'])
39+
def download_file_named_in_unicode():
40+
return excel.make_response_from_array([[1, 2], [3, 4]], "csv",
41+
file_name=u"中文文件名")
42+
43+
3744
# insert database related code here
3845
if __name__ == "__main__":
3946
app.run()

flask_excel/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88
:copyright: (c) 2015 by Onni Software Ltd.
99
:license: New BSD License
1010
"""
11+
try:
12+
# if in py2
13+
from urllib import quote
14+
_PY_VERSION = 2
15+
except ImportError:
16+
# else (aka in py3)
17+
from urllib.parse import quote
18+
_PY_VERSION = 3
19+
1120
from flask import Flask, Request, Response
1221
import pyexcel_webio as webio
1322

@@ -38,8 +47,13 @@ def _make_response(content, content_type, status, file_name=None):
3847
"""
3948
response = Response(content, content_type=content_type, status=status)
4049
if file_name:
50+
if _PY_VERSION == 2 and isinstance(file_name, unicode):
51+
file_name = file_name.encode('utf-8')
52+
url_encoded_file_name = quote(file_name)
4153
response.headers["Content-Disposition"] = (
42-
"attachment; filename=%s" % (file_name))
54+
"attachment; filename=%s;filename*=utf-8''%s"
55+
% (url_encoded_file_name, url_encoded_file_name)
56+
)
4357
return response
4458

4559

tests/test_upload_n_download_excel.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# -*- coding: utf-8 -*-
2+
3+
try:
4+
from urllib import quote
5+
except ImportError:
6+
from urllib.parse import quote
7+
18
from testapp import app
29
import pyexcel as pe
310
from nose.tools import eq_
@@ -71,8 +78,35 @@ def test_no_file_type(self):
7178
def test_override_file_name(self):
7279
for file_type in FILE_TYPE_MIME_TABLE.keys():
7380
file_name = 'override_file_name'
81+
url_encoded_file_name = quote(file_name)
82+
response = self.app.post('/file_name/%s/%s' % (file_type,
83+
file_name))
84+
eq_(response.content_type, FILE_TYPE_MIME_TABLE[file_type])
85+
eq_(response.headers.get("Content-Disposition", None),
86+
("attachment; filename=%s.%s;filename*=utf-8''%s.%s"
87+
% (url_encoded_file_name, file_type,
88+
url_encoded_file_name, file_type)))
89+
90+
def test_unicode_file_name(self):
91+
for file_type in FILE_TYPE_MIME_TABLE.keys():
92+
file_name = u'中文文件名'
93+
url_encoded_file_name = quote(file_name.encode('utf-8'))
94+
response = self.app.post('/file_name/%s/%s' % (file_type,
95+
file_name))
96+
eq_(response.content_type, FILE_TYPE_MIME_TABLE[file_type])
97+
eq_(response.headers.get("Content-Disposition", None),
98+
("attachment; filename=%s.%s;filename*=utf-8''%s.%s"
99+
% (url_encoded_file_name, file_type,
100+
url_encoded_file_name, file_type)))
101+
102+
def test_utf8_file_name(self):
103+
for file_type in FILE_TYPE_MIME_TABLE.keys():
104+
file_name = '中文文件名'
105+
url_encoded_file_name = quote(file_name)
74106
response = self.app.post('/file_name/%s/%s' % (file_type,
75107
file_name))
76108
eq_(response.content_type, FILE_TYPE_MIME_TABLE[file_type])
77109
eq_(response.headers.get("Content-Disposition", None),
78-
("attachment; filename=%s.%s" % (file_name, file_type)))
110+
("attachment; filename=%s.%s;filename*=utf-8''%s.%s"
111+
% (url_encoded_file_name, file_type,
112+
url_encoded_file_name, file_type)))

0 commit comments

Comments
 (0)