Python如何解决secure_filename对中文不支持问题


Posted in Python onJuly 16, 2021

前言:最近使用到了secure_filename,然后悲剧的发现中文居然不展示出来,于是我慢慢的debug,终于找到问题了。

一、最近使用secure_filename发现的问题

文件名是中文版的,悲剧的是中文以及其他特殊字符会被省略。

Python如何解决secure_filename对中文不支持问题

二、后面找到了原因

原来secure_filename()函数只返回ASCII字符,非ASCII字符会被过滤掉。

三、解决方案

找到secure_filename(filename)函数,修改它的源代码。

secure_filename(filename)函数源代码:
def secure_filename(filename: str) -> str:
    r"""Pass it a filename and it will return a secure version of it.  This
    filename can then safely be stored on a regular file system and passed
    to :func:`os.path.join`.  The filename returned is an ASCII only string
    for maximum portability.

    On windows systems the function also makes sure that the file is not
    named after one of the special device files.

    >>> secure_filename("My cool movie.mov")
    'My_cool_movie.mov'
    >>> secure_filename("../../../etc/passwd")
    'etc_passwd'
    >>> secure_filename('i contain cool \xfcml\xe4uts.txt')
    'i_contain_cool_umlauts.txt'

    The function might return an empty filename.  It's your responsibility
    to ensure that the filename is unique and that you abort or
    generate a random filename if the function returned an empty one.

    .. versionadded:: 0.5

    :param filename: the filename to secure
    """
    filename = unicodedata.normalize("NFKD", filename)
    filename = filename.encode("ascii", "ignore").decode("ascii")

    for sep in os.path.sep, os.path.altsep:
        if sep:
            filename = filename.replace(sep, " ")
    filename = str(_filename_ascii_strip_re.sub("", "_".join(filename.split()))).strip(
        "._"
    )

    # on nt a couple of special files are present in each folder.  We
    # have to ensure that the target file is not such a filename.  In
    # this case we prepend an underline
    if (
        os.name == "nt"
        and filename
        and filename.split(".")[0].upper() in _windows_device_files
    ):
        filename = f"_{filename}"

    return filename

secure_filename(filename)函数修改后的代码:

def secure_filename(filename: str) -> str:
    r"""Pass it a filename and it will return a secure version of it.  This
    filename can then safely be stored on a regular file system and passed
    to :func:`os.path.join`.  The filename returned is an ASCII only string
    for maximum portability.

    On windows systems the function also makes sure that the file is not
    named after one of the special device files.

    >>> secure_filename("My cool movie.mov")
    'My_cool_movie.mov'
    >>> secure_filename("../../../etc/passwd")
    'etc_passwd'
    >>> secure_filename('i contain cool \xfcml\xe4uts.txt')
    'i_contain_cool_umlauts.txt'

    The function might return an empty filename.  It's your responsibility
    to ensure that the filename is unique and that you abort or
    generate a random filename if the function returned an empty one.

    .. versionadded:: 0.5

    :param filename: the filename to secure
    """
    filename = unicodedata.normalize("NFKD", filename)
    filename = filename.encode("utf8", "ignore").decode("utf8")   # 编码格式改变

    for sep in os.path.sep, os.path.altsep:
        if sep:
            filename = filename.replace(sep, " ")
    _filename_ascii_add_strip_re = re.compile(r'[^A-Za-z0-9_\u4E00-\u9FBF\u3040-\u30FF\u31F0-\u31FF.-]')
    filename = str(_filename_ascii_add_strip_re.sub('', '_'.join(filename.split()))).strip('._')             # 添加新规则

    # on nt a couple of special files are present in each folder.  We
    # have to ensure that the target file is not such a filename.  In
    # this case we prepend an underline
    if (
        os.name == "nt"
        and filename
        and filename.split(".")[0].upper() in _windows_device_files
    ):
        filename = f"_{filename}"

    return filename

四、效果展示

我们很清楚的看到了效果,目前是支持中文的

Python如何解决secure_filename对中文不支持问题

到此这篇关于Python如何解决secure_filename对中文不支持问题的文章就介绍到这了,更多相关Python secure_filename不支持中文内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用Python的urllib库提交WEB表单
Feb 24 Python
Python中的特殊语法:filter、map、reduce、lambda介绍
Apr 14 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
python爬取哈尔滨天气信息
Jul 14 Python
详解Python 解压缩文件
Apr 09 Python
python原类、类的创建过程与方法详解
Jul 19 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
PyCharm搭建Spark开发环境的实现步骤
Sep 05 Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 Python
python 如何实现遗传算法
Sep 22 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
利用Matlab绘制各类特殊图形的实例代码
Flask response响应的具体使用
Python 快速验证代理IP是否有效的方法实现
Jul 15 #Python
Django路由层如何获取正确的url
Jul 15 #Python
Python实现排序方法常见的四种
Jul 15 #Python
手把手教你使用TensorFlow2实现RNN
一篇文章弄懂Python关键字、标识符和变量
You might like
玛琪朵 Macchiato
2021/03/03 咖啡文化
php 文章调用类代码
2011/08/11 PHP
简单的php新闻发布系统教程
2014/05/09 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
PHP实现无限极分类图文教程
2014/11/25 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
Javascript this关键字使用分析
2008/10/21 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python的内存泄漏及gc模块的使用分析
2014/07/16 Python
简单的Python抓taobao图片爬虫
2014/10/26 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
python实现最短路径的实例方法
2020/07/19 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
中秋晚会策划方案
2014/06/12 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
五年级作文之劳动作文
2019/11/12 职场文书