文章内容
2018/7/29 17:26:12,作 者: 黄兵
secure_filename() 中文出错
最近在处理文件上传的时候,出问题了。
当上传中文文件的时候,使用Werkzeug提供的secure_filename()函数来处理文件名,当遇到中文的时候获取到的文件名为空。
具体的代码在这篇文章:Flask文件上传
出现问题的原因:
secure_filename()函数只返回ASCII字符,非ASCII字符会被过滤掉。
解决方案:
中文文件名需要转换成英文,可以使用pypinyin来转换(使用pip安装),比如:
项目地址:汉字转拼音(pypinyin)
修改项目代码:
导入包:
from pypinyin import lazy_pinyin
之后修改代码:
@manage.route('/upload_file', methods=['GET', 'POST']) @login_required def upload_file(): if request.method == 'POST': file = request.files['file'] if file and allowed_file(file.filename): filename = secure_filename(file.filename) if filename.startswith('.'): name = file.filename.split('.')[0] ext = file.filename.split('.')[1] filename = '_'.join(lazy_pinyin(name)) + '.' + ext else: name =file.filename.split('.')[0] ext = file.filename.split('.')[1] filename = '_'.join(lazy_pinyin(name)) + '.' + ext file.save(os.path.join(current_app.config['UPLOAD_FOLDER'], filename)) old_path = os.path.join(current_app.config['UPLOAD_FOLDER'], filename) new_filename = str(uuid.uuid4()) + '.' + filename.rsplit('.', 1)[1] new_path = os.path.join(current_app.config['UPLOAD_FOLDER'], new_filename) # rename file os.rename(old_path, new_path) # save as file name to database current_user.profile_picture = new_filename db.session.add(current_user._get_current_object()) db.session.commit() return '0' return '1'
测试,问题解决。
参考资料:
汉字转拼音(pypinyin):https://pypinyin.readthedocs.io
Flask文件上传(四):文件管理与多文件上传
黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - secure_filename() 中文出错
评论列表