碰到以下问题:
将中文文件名传给 secure_filename 方法时所有的中文名都会被过滤掉,只剩下文件后缀名。
原因:werkzeug库的secure_filename方法中,中文被ignore或者压制导致数据缺失
解决方法:
1,要么更换或弃用中文文件名
2,视情况修改secure_filename方法的代码
def secure_filename(filename):
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(u'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 generate random
filename if the function returned an empty one.
.. versionadded:: 0.5
:param filename: the filename to secure
"""
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('._')
# 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 = '_' + filename
return filename
在使用Flask时遇到一个问题,当尝试用secure_filename处理包含中文的文件名时,中文部分被过滤只剩后缀。原因是werkzeug库的此方法不支持中文。解决方案包括避免使用中文文件名或自定义secure_filename方法的实现。
2803

被折叠的 条评论
为什么被折叠?



