flask(werkzeug.util )的secure_filename的中文上传问题今天使用werkzeug.util中的secure_filename时,会出现中文名字上传问题
代码结构是
-template
-upload.html -简单的上传表单html
-upload -上传文件保存在此文件夹中
-XX.XX -这里是上传文件的地方
-root.py -处理文件
upload.html很简单。 这是html5的上传文件表单。 其中name是文件名称
! doctypehtmlhtmllang=' en ' headmetacharset=' utf-8 ' title title/title/headbodyformaction=' ' method=' post ' ench form-data ' input type=' filename ' input type=' submit ' voubmit
root.py
--- coding : utf-8-- fromwerkzeug.utilsimportsecure _ filenamefromflaskimportflask,request, render _ templaask redirectfromosimportpathapp=flask (_ name _ _ ) (app.route ),methods=['GET ',' post ' ] () fromunicodedataimportnormalizef.save (path.join ) path.abspath (path.dirname ) _ _ file _ (' uploads ' ) ) ' strict ' ).decode(utf-8 ) ) ) return redirect (URL _ for ) upload ) ) returnrender_template ) upload.hoad
普通的中文名字消失了
在那里处理后就正常了
处理方法如下
root.py的
f.save(upload_path )/'secure_filename ) normalize )、f.filename ).encode )、' ascii '、' ignore ' ) )。
f.save(upload_path )/'secure_filename ) normalize )、f.filename ).encode )、' utf-8 '、' ignore '
打开util.py
第三十行
_ filename _ ascii _ strip _ re=re.com pile (r ' [ ^ a-za-z0-9 _.- ] )后接一行
_ filename _ gbk _ strip _ re=re.com pile (u ' [ ^ _ u4e 00-_ u9fa 5a-za-z0-9 _.- ] )这就是添加了汉字的unicode的修正版正则
然后找到了secure_filename函数
那280行和282行有两个ascii,将其更改为utf-8
即,从
ifisinstance(filename,text_type ) : fromunicodedataimportnormalizefilename=normalize (nfkd ',filename ).encce
ifisinstance(filename,text_type ) : fromunicodedataimportnormalizefilename=normalize (nfkd ', filename ).encce 'ignore ' ) ifno tpy 2: filename=filename.decode (utf-8 ) )最后,在第286行中的_ filename _ ascii _ strii _ stred
filename=str (filename _ ascii _ strip _ re.sub (',' _'.join ) filename.split ) ) ).strip )。
filename=str (filename _ gbk _ strip _ re.sub (',' _'.join ) filename.split ) ).strip )._ ' )。