python - “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
有人可以帮我解决这个问题。
解决方案
您将文件作为文本流读取(因为模式是'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