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 相关文章推荐
Using Django with GAE Python 后台抓取多个网站的页面全文
Feb 17 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
利用pandas将numpy数组导出生成excel的实例
Jun 14 Python
Python中的heapq模块源码详析
Jan 08 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
Python3实现将一维数组按标准长度分隔为二维数组
Nov 29 Python
python实现可下载音乐的音乐播放器
Feb 25 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
学习Python爬虫的几点建议
Aug 05 Python
Python 串口通信的实现
Sep 29 Python
Python中常见的导入方式总结
May 06 Python
Python绘制地图神器folium的新人入门指南
May 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中实现中文字符进制转换原理分析
2011/12/06 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
php计算整个目录大小的方法
2015/06/19 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
window.opener用法和用途实例介绍
2013/08/19 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
JS使用Date对象实时显示当前系统时间简单示例
2018/08/23 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
Python之时间和日期使用小结
2019/02/14 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
幼儿园感恩节活动方案
2014/10/06 职场文书
病人慰问信范文
2015/02/15 职场文书
525心理健康活动总结
2015/05/08 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
全新239军机修复记
2022/04/05 无线电
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android