首页 > 解决方案 > “utf-8”编解码器无法解码位置 14 中的字节 0x97:无效的起始字节

问题描述

我想在单击按钮时从我的服务器下载一个目录。该目录应以 zip 格式下载。我正在使用 Django 和 Python。我之前尝试过使用相同的代码,但它是在 Python2 venv 上。Python3 venv 上的相同代码给出了utf-8 编解码器无法解码字节错误。目录的 zip 已成功创建,但是当我按下网站上的下载按钮时,它会抛出上述错误。

@login_required
def logs_folder_index(request):
    user = request.user
    if not is_moderator(user):
        raise Http404("You are not allowed to see this page.")
    else:
        if os.path.exists('Experiments.zip'):
            os.remove('Experiments.zip')
        zipf = zipfile.ZipFile('Experiments.zip','w',zipfile.ZIP_DEFLATED)
        path = settings.BASE_DIR + '/experiments/'
        zipdir(path,zipf)
        zipf.close()
        zip_file = open('Experiments.zip','r')
        response = HttpResponse(zip_file, 
                content_type='application/force-download')
        response['Content-Disposition'] = 'attachment; filename="{0}"'\
                                        .format(Experiments.zip)
        return response

有人可以帮我解决这个问题。

标签: pythondjangopython-3.x

解决方案


您将文件作为文本流读取(因为模式是'r',而不是'rb')。由于 zip 通常不以 UTF-8(或一般的任何文本编解码器)编码,因此它最终可能会达到无法解码(或将被无意义地解码)的字节序列,因此您应该将其阅读为二进制文件:

@login_required
def logs_folder_index(request):
    user = request.user
    if not is_moderator(user):
        raise Http404("You are not allowed to see this page.")
    elif os.path.exists('Experiments.zip'):
        os.remove('Experiments.zip')
    with zipfile.ZipFile('Experiments.zip','w',zipfile.ZIP_DEFLATED) as zipf:
        path = settings.BASE_DIR + '/experiments/'
        zipdir(path,zipf)
    with open('Experiments.zip','rb') as stream:
        response = HttpResponse(stream, content_type='application/force-download')
        response['Content-Disposition'] = 'attachment; filename="Experiments.zip"'
        return response

推荐阅读