From 25c7743679f0267789b39e5a72a0fa7065774287 Mon Sep 17 00:00:00 2001 From: Xiaoquan Kong Date: Thu, 22 Jun 2017 00:05:46 +0800 Subject: [PATCH 1/6] Add support to unicode file name --- flask_excel/__init__.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/flask_excel/__init__.py b/flask_excel/__init__.py index b10147a..b42104b 100644 --- a/flask_excel/__init__.py +++ b/flask_excel/__init__.py @@ -8,6 +8,15 @@ :copyright: (c) 2015 by Onni Software Ltd. :license: New BSD License """ +try: + # if in py2 + from urllib import quote + _PY_VERSION = 2 +except ImportError: + # else (aka in py3) + from urllib.parse import quote + _PY_VERSION = 3 + from flask import Flask, Request, Response import pyexcel_webio as webio @@ -38,8 +47,11 @@ def _make_response(content, content_type, status, file_name=None): """ response = Response(content, content_type=content_type, status=status) if file_name: + if _PY_VERSION == 2 and isinstance(file_name, unicode): + file_name = file_name.encode('utf-8') + url_encoded_file_name = quote(file_name) response.headers["Content-Disposition"] = ( - "attachment; filename=%s" % (file_name)) + "attachment; filename=%s;filename*=utf-8''%s" % (url_encoded_file_name, url_encoded_file_name)) return response From 2f9363003ce6b045340549674ddedd7d5e370370 Mon Sep 17 00:00:00 2001 From: Xiaoquan Kong Date: Thu, 22 Jun 2017 00:41:56 +0800 Subject: [PATCH 2/6] Update test case for support unicode file name --- tests/test_upload_n_download_excel.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/test_upload_n_download_excel.py b/tests/test_upload_n_download_excel.py index b4bc8e8..d9e8a3f 100644 --- a/tests/test_upload_n_download_excel.py +++ b/tests/test_upload_n_download_excel.py @@ -1,3 +1,8 @@ +try: + from urllib import quote +except ImportError: + from urllib.parse import quote + from testapp import app import pyexcel as pe from nose.tools import eq_ @@ -71,8 +76,10 @@ def test_no_file_type(self): def test_override_file_name(self): for file_type in FILE_TYPE_MIME_TABLE.keys(): file_name = 'override_file_name' + url_encoded_file_name = quote(file_name) response = self.app.post('/file_name/%s/%s' % (file_type, file_name)) eq_(response.content_type, FILE_TYPE_MIME_TABLE[file_type]) eq_(response.headers.get("Content-Disposition", None), - ("attachment; filename=%s.%s" % (file_name, file_type))) + ("attachment; filename=%s.%s;filename*=utf-8''%s.%s" % (url_encoded_file_name, file_type, + url_encoded_file_name, file_type))) From e026c6d5d446faac05ec7e0942c73ef6dea28383 Mon Sep 17 00:00:00 2001 From: Xiaoquan Kong Date: Thu, 22 Jun 2017 01:10:50 +0800 Subject: [PATCH 3/6] Modify code to fulfill the requirement of PEP8's maximum line length (79) limitation --- flask_excel/__init__.py | 4 +++- tests/test_upload_n_download_excel.py | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/flask_excel/__init__.py b/flask_excel/__init__.py index b42104b..ee3ca4e 100644 --- a/flask_excel/__init__.py +++ b/flask_excel/__init__.py @@ -51,7 +51,9 @@ def _make_response(content, content_type, status, file_name=None): file_name = file_name.encode('utf-8') url_encoded_file_name = quote(file_name) response.headers["Content-Disposition"] = ( - "attachment; filename=%s;filename*=utf-8''%s" % (url_encoded_file_name, url_encoded_file_name)) + "attachment; filename=%s;filename*=utf-8''%s" + % (url_encoded_file_name, url_encoded_file_name) + ) return response diff --git a/tests/test_upload_n_download_excel.py b/tests/test_upload_n_download_excel.py index d9e8a3f..130cffc 100644 --- a/tests/test_upload_n_download_excel.py +++ b/tests/test_upload_n_download_excel.py @@ -81,5 +81,6 @@ def test_override_file_name(self): file_name)) eq_(response.content_type, FILE_TYPE_MIME_TABLE[file_type]) eq_(response.headers.get("Content-Disposition", None), - ("attachment; filename=%s.%s;filename*=utf-8''%s.%s" % (url_encoded_file_name, file_type, - url_encoded_file_name, file_type))) + ("attachment; filename=%s.%s;filename*=utf-8''%s.%s" + % (url_encoded_file_name, file_type, + url_encoded_file_name, file_type))) From 1763c974aef2a1121821905c5f94c1ad7a2fa1d7 Mon Sep 17 00:00:00 2001 From: Xiaoquan Kong Date: Thu, 22 Jun 2017 01:28:58 +0800 Subject: [PATCH 4/6] Add unicode file name downloading example --- examples/tiny_example.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/examples/tiny_example.py b/examples/tiny_example.py index 693bb3a..4d993a4 100644 --- a/examples/tiny_example.py +++ b/examples/tiny_example.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ tiny_example.py :copyright: (c) 2015 by C. W. @@ -34,6 +35,18 @@ def export_records(): file_name="export_data") +@app.route("/download_unicode_file_name_utf8", methods=['GET']) +def download_unicode_file_name_utf8(): + return excel.make_response_from_array([[1, 2], [3, 4]], "csv", + file_name="中文文件名") + + +@app.route("/download_unicode_file_name_unicode", methods=['GET']) +def download_unicode_file_name_unicode(): + return excel.make_response_from_array([[1, 2], [3, 4]], "csv", + file_name=u"中文文件名") + + # insert database related code here if __name__ == "__main__": app.run() From b8e491050052f8144a3abee86a6b40934434a1ef Mon Sep 17 00:00:00 2001 From: Xiaoquan Kong Date: Thu, 22 Jun 2017 13:31:45 +0800 Subject: [PATCH 5/6] Add test cases and reduce number of demo for supporting of unicode file name --- examples/tiny_example.py | 10 ++-------- tests/test_upload_n_download_excel.py | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/examples/tiny_example.py b/examples/tiny_example.py index 4d993a4..84289d0 100644 --- a/examples/tiny_example.py +++ b/examples/tiny_example.py @@ -35,14 +35,8 @@ def export_records(): file_name="export_data") -@app.route("/download_unicode_file_name_utf8", methods=['GET']) -def download_unicode_file_name_utf8(): - return excel.make_response_from_array([[1, 2], [3, 4]], "csv", - file_name="中文文件名") - - -@app.route("/download_unicode_file_name_unicode", methods=['GET']) -def download_unicode_file_name_unicode(): +@app.route("/download_file_named_in_unicode", methods=['GET']) +def download_file_named_in_unicode(): return excel.make_response_from_array([[1, 2], [3, 4]], "csv", file_name=u"中文文件名") diff --git a/tests/test_upload_n_download_excel.py b/tests/test_upload_n_download_excel.py index 130cffc..9890878 100644 --- a/tests/test_upload_n_download_excel.py +++ b/tests/test_upload_n_download_excel.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + try: from urllib import quote except ImportError: @@ -84,3 +86,27 @@ def test_override_file_name(self): ("attachment; filename=%s.%s;filename*=utf-8''%s.%s" % (url_encoded_file_name, file_type, url_encoded_file_name, file_type))) + + def test_unicode_file_name(self): + for file_type in FILE_TYPE_MIME_TABLE.keys(): + file_name = u'中文文件名' + url_encoded_file_name = quote(file_name.encode('utf-8')) + response = self.app.post('/file_name/%s/%s' % (file_type, + file_name)) + eq_(response.content_type, FILE_TYPE_MIME_TABLE[file_type]) + eq_(response.headers.get("Content-Disposition", None), + ("attachment; filename=%s.%s;filename*=utf-8''%s.%s" + % (url_encoded_file_name, file_type, + url_encoded_file_name, file_type))) + + def test_utf8_file_name(self): + for file_type in FILE_TYPE_MIME_TABLE.keys(): + file_name = '中文文件名' + url_encoded_file_name = quote(file_name) + response = self.app.post('/file_name/%s/%s' % (file_type, + file_name)) + eq_(response.content_type, FILE_TYPE_MIME_TABLE[file_type]) + eq_(response.headers.get("Content-Disposition", None), + ("attachment; filename=%s.%s;filename*=utf-8''%s.%s" + % (url_encoded_file_name, file_type, + url_encoded_file_name, file_type))) \ No newline at end of file From 7ce635f1373fd54d1ce021634b06365ff70499cf Mon Sep 17 00:00:00 2001 From: Xiaoquan Kong Date: Thu, 22 Jun 2017 13:35:27 +0800 Subject: [PATCH 6/6] Fix issue: W292 no newline at end of file --- tests/test_upload_n_download_excel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_upload_n_download_excel.py b/tests/test_upload_n_download_excel.py index 9890878..80c951c 100644 --- a/tests/test_upload_n_download_excel.py +++ b/tests/test_upload_n_download_excel.py @@ -109,4 +109,4 @@ def test_utf8_file_name(self): eq_(response.headers.get("Content-Disposition", None), ("attachment; filename=%s.%s;filename*=utf-8''%s.%s" % (url_encoded_file_name, file_type, - url_encoded_file_name, file_type))) \ No newline at end of file + url_encoded_file_name, file_type)))