python 七牛工具包 中文路径乱码解决方案

版本:qiniu==7.0.8
环境:Mac os 10.12.3

最近写了一套七牛上传的工具包,涉及到中文歌曲路径,就会报错:
  File "/Users/ouyang/PycharmProjects/myApp/venv/lib/python2.7/site-packages/qiniu/services/storage/upload_progress_recorder.py", line 34, in get_upload_record
    record_file_name = base64.b64encode(key.encode('utf-8')).decode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 5: ordinal not in range(128)
查看问题代码位于/Users/ouyang/PycharmProjects/myApp/venv/lib/python2.7/site-packages/qiniu/services/storage/uploader.py”:
def get_upload_record(self, file_name, key):
    key = '{0}/{1}'.format(key, file_name)

    record_file_name = base64.b64encode(key.encode('utf-8')).decode('utf-8')

    upload_record_file_path = os.path.join(self.record_folder,
                                           record_file_name)
    
    if not os.path.isfile(upload_record_file_path):
        return None
    with open(upload_record_file_path, 'r') as f:
        json_data = json.load(f)
    return json_data
上面的file_name是unicode字符串,但key='{0}/{1}’.format(key, file_name)这里是容不下unicode字符串的。

解决方案一
我们自己把所有的设计unicode的编码都手动改成utf-8,然后保证传进来的都是utf-8即可。
只需要修改两个文件的部分代码即可:
upload_process_recorder.py:
# -*- coding: utf-8 -*-

import base64
import json
import os
import tempfile


class UploadProgressRecorder(object):
    """持久化上传记录类

    该类默认保存每个文件的上传记录到文件系统中,用于断点续传
    上传记录为json格式:
    {
        "size": file_size,
        "offset": upload_offset,
        "modify_time": file_modify_time,
        "contexts": contexts
    }

    Attributes:
        record_folder: 保存上传记录的目录
    """
    def __init__(self, record_folder=tempfile.gettempdir()):
        self.record_folder = record_folder

    def get_upload_record(self, file_name, key):
        if type(file_name) is unicode:
            file_name = file_name.encode('utf-8')
        key = '{0}/{1}'.format(key, file_name)

        # record_file_name = base64.b64encode(key.encode('utf-8')).decode('utf-8')
        record_file_name = base64.b64encode(key)
        record_file_name = record_file_name.replace('/', '_') # 去掉/字符的出现在路径的可能性

        upload_record_file_path = os.path.join(self.record_folder,
                                               record_file_name)
        print record_file_name

        if not os.path.isfile(upload_record_file_path):
            return None
        with open(upload_record_file_path, 'r') as f:
            json_data = json.load(f)
        return json_data

    def set_upload_record(self, file_name, key, data):
        if type(file_name) is unicode:
            file_name = file_name.encode('utf-8')

        key = '{0}/{1}'.format(key, file_name)
        # record_file_name = base64.b64encode(key.encode('utf-8')).decode('utf-8')
        record_file_name = base64.b64encode(key)
        record_file_name = record_file_name.replace('/', '_')

        upload_record_file_path = os.path.join(self.record_folder,
                                               record_file_name)
        with open(upload_record_file_path, 'w') as f:
            json.dump(data, f)

    def delete_upload_record(self, file_name, key):

        if type(file_name) is unicode:
            file_name = file_name.encode('utf-8')

        key = '{0}/{1}'.format(key, file_name)
        record_file_name = base64.b64encode(key)
        record_file_name = record_file_name.replace('/', '_')

        # record_file_name = base64.b64encode(key.encode('utf-8')).decode('utf-8')
        record_file_path = os.path.join(self.record_folder,
                                        record_file_name)
        os.remove(record_file_path)
uploader.py:
这个只加了两行(143-144):
if type(self.file_name) is unicode:
    self.file_name = self.file_name.encode('utf-8')

解决方案二
# 修改文件名为非中文,不然七牛那边好麻烦...歌曲上传到七牛
song_path = full_file_path.replace(single_name, 'a.mp3')
os.rename(full_file_path, full_file_path.replace(single_name, 'a.mp3’))
# 再把文件名改回去...
os.rename(full_file_path.replace(single_name, 'a.mp3'), full_file_path)


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值