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 相关文章推荐
easy_install python包安装管理工具介绍
Feb 10 Python
Python中pip安装非PyPI官网第三方库的方法
Jun 02 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
对pandas进行数据预处理的实例讲解
Apr 20 Python
解决Python一行输出不显示的问题
Dec 03 Python
对python中类的继承与方法重写介绍
Jan 20 Python
python Tkinter的图片刷新实例
Jun 14 Python
python多线程http压力测试脚本
Jun 25 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
python 并发下载器实现方法示例
Nov 22 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
Python面向对象程序设计之继承、多态原理与用法详解
Mar 23 Python
利用Matlab绘制各类特殊图形的实例代码
Flask response响应的具体使用
Python 快速验证代理IP是否有效的方法实现
Jul 15 #Python
Django路由层如何获取正确的url
Jul 15 #Python
Python实现排序方法常见的四种
Jul 15 #Python
手把手教你使用TensorFlow2实现RNN
一篇文章弄懂Python关键字、标识符和变量
You might like
PHP生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
PHP实现的简单缓存类
2015/07/29 PHP
禁止F5等快捷键的JS代码
2007/03/06 Javascript
JavaScript 学习笔记(十五)
2010/01/28 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
移动前端图片压缩上传的实例
2017/12/06 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
python绘图库Matplotlib的安装
2014/07/03 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
英国排名第一的宠物店:PetPlanet
2020/02/02 全球购物
工作人员思想汇报
2014/01/09 职场文书
教学评估实施方案
2014/03/16 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
汉语拼音教学反思
2016/02/22 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python