Flask中secure_filename()获取中文文件名问题

Flask中secure_filename()获取中文文件名问题

用secure_filename获取中文文件名时,中文会被省略。

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

解决方法:

  • 修改源码
    def secure_filename(filename):
    
        if isinstance(filename, text_type):
            from unicodedata import normalize
            
            filename = normalize("NFKD", filename).encode("utf-8", "ignore")  # 转码
            # filename = normalize("NFKD", filename).encode("ascii", "ignore")  # 源码
            if not PY2:
                filename = filename.decode("utf-8")  # 解码
                # filename = filename.decode("ascii")  # 源码
        for sep in os.path.sep, os.path.altsep:
            if sep:
                filename = filename.replace(sep, " ")
    
        # myself define
        # 正则增加对汉字的过滤
        # \u4E00-\u9FBF 中文
        # 构建新正则
    
        # _filename_ascii_add_strip_re = re.compile(r'[^A-Za-z0-9_\u4E00-\u9FBF.-]')
        
        # 使用正则
        filename = str(_filename_ascii_strip_re.sub("", "_".join(filename.split()))).strip(
            "._"
        )
    
  • 使用第三方库(pypinyin)
    • 将中文名转换成拼音
    from pypinyin import lazy_pinyin
    filename = secure_filename(''.join(lazy_pinyin(file.filename)))
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值