secure_filename 对中文不支持的处理

  • 采用了对源码进行修改,增加对中文的支持。

说明

  • 使用环境 werkzeug 0.14.1 python 3.6
  • 关于 secure_filename() 的过滤代码写在 \Python36\Lib\site-packages\werkzeug\utils.py 277 行开始。

初始代码

if isinstance(filename, text_type):
    from unicodedata import normalize
    filename = normalize('NFKD', filename).encode('ascii', 'ignore') # 转码
    if not PY2:
        filename = filename.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('._')

最终代码

 if isinstance(filename, text_type):
     from unicodedata import normalize
     filename = normalize('NFKD', filename).encode('utf-8', 'ignore') # 转码
     if not PY2:
         filename = filename.decode('utf-8') # 解码
 for sep in os.path.sep, os.path.altsep:
     if sep:
         filename = filename.replace(sep, ' ')
 
 # 正则增加对汉字和日语假名的部分(本人有需求)
 # \u4E00-\u9FBF 中文
 # \u3040-\u30FF 假名
 # \u31F0-\u31FF 片假名扩展
 _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('._')

测试效果

@blue_PushBlog.route('/upload', methods=['POST'])
def upload():
	if request.method == 'POST':
		f = request.files['file']
		if f:
			filename = secure_filename(f.filename) # Character
			f.save(os.path.join('.', filename))
  • 返回 JSON 的截图
    截图
    修改前截图 修改后截图

版权声明:本文为qq_30490489原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。