django返回⽂件字节流
django怎么学
因项⽬中要⽣成Excel 并返回
代码
def file_iterator(file_name, chunk_size=512):
'''
# ⽤于形成⼆进制数据
:return:
'''
with open(file_name,'rb')as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
返回到前端
def retrieve(self, request,*args,**kwargs):
instance = _object()
# instance = (id=1)
name ="{}-{}.xlsx".format(instance.project.name, instance.name)
create_name ="design_{}.xlsx".format(instance.id)
path = os.path.join(BASE_DIR,"media", create_name)
import xlsxwriter
workbook = xlsxwriter.Workbook(path)
worksheet = workbook.add_worksheet("元件")
headings =['名称','品牌','规格','数量']
worksheet.write_row("A1", headings)
pdetails = Details.objects.filter(design=instance,category__in=(1,2))
row =1
for p in pdetails:
worksheet.write(row,0, p.name)
worksheet.write(row,1, p.brand)
worksheet.write(row,2, p.size)
worksheet.write(row,3, p.num)
row +=1
workbook.close()
># 下⾯返回⽣成的 Excel
file= file_iterator(path)
response = StreamingHttpResponse(file)
response['Content-Type']='application/txt'
# 注意filename 这个是下载后的名字
response['Content-Disposition']='attachment;filename="{}"'.format(name)
return response
Django 返回流⽂件时使⽤中⽂⽂件名的问题
在测试的过程中发现了⼀个问题,⽆论我怎么在响应头中添加 Content-Disposition 指定⽂件名,在 Chrome 浏览器中访问的时候返回的⽂件名始终是按 url 的最后⼀段⾃动⽣成的⽂件名,⽽将⽂件名改成英⽂以后⼜是正常的。
猜测应该是字符串编码的问题,http 响应头中字符应该按照 url 百分号编码。
修改为以下代码后,终于能够正常显⽰中⽂⽂件名了。
python3
# Python3
from urllib.parse import quote
...
response['Content-Disposition']='attachment; filename={0}.xlsx'.format(quote(filename)) python2
# Python2
from urllib import quote
...
# 向下兼容 Python2.6 以前的格式化字符串
response['Content-Disposition']='attachment; filename=%s.xlsx'% quote(filename)

发表评论