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操作MongoDB基础知识
Nov 01 Python
python 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
进一步探究Python的装饰器的运用
May 05 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
python3实现磁盘空间监控
Jun 21 Python
Python拼接微信好友头像大图的实现方法
Aug 01 Python
关于pymysql模块的使用以及代码详解
Sep 01 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
使用python3批量下载rbsp数据的示例代码
Dec 20 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 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维护文件系统
2006/10/09 PHP
劣质的PHP代码简化
2010/02/08 PHP
详解PHP中的Traits
2015/07/29 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
2017/05/15 PHP
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
使用python Django做网页
2013/11/04 Python
在Django的session中使用User对象的方法
2015/07/23 Python
Python的Flask开发框架简单上手笔记
2015/11/16 Python
Python遍历目录中的所有文件的方法
2016/07/08 Python
django如何连接已存在数据的数据库
2018/08/14 Python
opencv与numpy的图像基本操作
2019/03/08 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
护理专业优质毕业生自荐书
2014/01/31 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
项目建议书格式
2014/03/12 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
用Python实现Newton插值法
2021/04/17 Python