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)))