latin-1 codec cant encode characters in position 42-48: ordinal not in range256 下载文件时候报错...

 

python后端写下载文件, 这个时候出现了这个错误

latin-1 codec cant encode characters in position 42-48: ordinal not in range256

怎么办:

查起因: 发现文件名有中文名字, 所以导致错误, 编码是latin-1编码, 所以我们需要解码成unicode在编码成latin-1

先看代码:

  这段代码涉及python转码问题, 一定要注意

                FilePathName = self.get_argument("FilePathName", None) #获取文件名
                FileName = str(FilePathName.split("/")[-1]).strip() # 得到文件名
                latinFileName = FileName.encode("utf-8").decode("latin1") # 这句很关键, 要解析成latin-1才OK,这样就不会报错

 

class DownFileHandler(downBaseRequestHandler):
    @tornado.gen.coroutine
    def get(self, *args, **kwargs):

        if self.verifyFlag == 1 and self.status == 0:
            status = 2000

            try:
                FilePathName = self.get_argument("FilePathName", None)
                FilePathName = MyBase64.decryption(unquote(FilePathName)) # 这句是解密
                FileName = str(FilePathName.split("/")[-1]).strip()
                latinFileName = FileName.encode("utf-8").decode("latin1") # 这句很关键, 要解析成latin-1才OK,这样就不会报错
                newFileName = str(int(time.time())) + "." + FileName.split(".")[1] # 第二种方式就是换一个文件名
                self.set_header("Content-Type", "application/x-zip-compressed")
                # -----<或者这么写> ----- #
                # self.set_header("Content-Type", "application/octet-stream")
                self.set_header("Content-Disposition", "attachment; filename=%s" % latinFileName)
                f = open(FilePathName, 'rb')
                while True:
                    b = f.read(8096)
                    if not b:
                        break
                    else:
                        self.write(b)
                self.flush()
                f.close()

            except Exception as e:
                e = FormatErrorCode(e)
                my_log.error(e)
                status = int(e[0])
                self.write(json.dumps(result(status=status)))
            self.finish()
        else:
            self.write(json.dumps(result(status=4005)))
            self.finish()

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值