文章内容

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):
Flask文件上传(四):文件管理与多文件上传


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - secure_filename() 中文出错

分享到:

发表评论

评论列表