9

我浏览了 django 文档,发现这段代码允许您将文件呈现为附件

dl = loader.get_template('files/foo.zip')
context = RequestContext(request)
response = HttpResponse(dl.render(context), content_type = 'application/force-download')
response['Content-Disposition'] = 'attachment; filename="%s"' % 'foo.zip'
return response

foo.zip 文件是使用 pythons zipfile.ZipFile().writestr 方法创建的

zip = zipfile.ZipFile('foo.zip', 'a', zipfile.ZIP_DEFLATED)
zipinfo = zipfile.ZipInfo('helloworld.txt', date_time=time.localtime(time.time()))
zipinfo.create_system = 1
zip.writestr(zipinfo, StringIO.StringIO('helloworld').getvalue())
zip.close()

但是当我尝试上面的代码来渲染文件时,我收到了这个错误

“utf8”编解码器无法解码位置 10 中的字节 0x89:无效的起始字节

关于如何正确执行此操作的任何建议?

4

2 回答 2

18

我认为您想要的是提供一个文件供人们下载。如果是这样,您不需要渲染文件,它不是模板,您只需使用 Django 的 HttpResponse 将其作为附件提供

zip_file = open(path_to_file, 'r')
response = HttpResponse(zip_file, content_type='application/force-download')
response['Content-Disposition'] = 'attachment; filename="%s"' % 'foo.zip'
return response
于 2013-10-18T22:14:05.257 回答
6

FileResponse优先HttpResponse于二进制文件。此外,以模式打开文件'rb'可防止UnicodeDecodeError.

zip_file = open(path_to_file, 'rb')
return FileResponse(zip_file)
于 2019-08-25T15:24:34.093 回答