在HttpResponse中返回python字节数组
我有一个django视图,我想返回一个Excel文件。代码如下:在HttpResponse中返回python字节数组,python,django,Python,Django,我有一个django视图,我想返回一个Excel文件。代码如下: def get_template(request, spec_pk): spec = get_object_or_404(Spec, pk=spec_pk) response = HttpResponse(spec.get_template(), mimetype='application/ms-excel') response['Content-Disposition'] = 'attachment;
def get_template(request, spec_pk):
spec = get_object_or_404(Spec, pk=spec_pk)
response = HttpResponse(spec.get_template(), mimetype='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
return response
在该示例中,spec.get_template()
的类型是
,它包含Excel电子表格的二进制数据
问题是,当我试图下载该视图,并用Excel打开它时,它以乱码二进制数据的形式出现。但是我知道bytearray
是正确的,因为如果我执行以下操作:
f = open('temp.xls', 'wb')
f.write(spec.get_template())
我可以在Excel中完美地打开temp.xls
我甚至将我的视图修改为:
def get_template(request, spec_pk):
spec = get_object_or_404(Spec, pk=spec_pk)
f = open('/home/user/temp.xls', 'wb')
f.write(spec.get_template())
f.close()
f = open('/home/user/temp.xls', 'rb')
response = HttpResponse(f.read(), mimetype='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
return response
它工作得很好-我可以从浏览器打开xls文件到Excel,一切都很好
所以我的问题是-在我将它传递给
HttpResponse
之前,我需要做什么。为什么将它保存为二进制文件,然后重新打开它可以很好地工作,但是传递bytearray
本身会导致数据混乱?好的,通过完全随机(并且非常持久)的尝试和错误,我找到了一个使用pythonbinascii
模块的解决方案
这项工作:
response = HttpResponse(binascii.a2b_qp(spec.get_template()), mimetype='application/ms-excel')
根据binascii.a2b_qp的python文档:
将引用的可打印数据块转换回二进制并返回二进制数据。一次可以通过多条线路。如果可选参数标头存在且为true,则下划线将被解码为空格
希望有人能告诉我为什么将它保存为二进制文件,然后重新打开它会起作用。这是一个杂乱无章的ASCII文本,非常、非常、非常长。根据
文件:ASCII文本,具有非常长的行,没有行终止符
,不幸的是,这不够具体。你必须让他们通过一个二进制的差异。。。根据cmp
:bad.xls good.xls不同:字节1,第1行
找到了一个解决方案(回答如下),感谢您的帮助。