django 返回文件字节流
生活随笔
收集整理的這篇文章主要介紹了
django 返回文件字节流
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
因項(xiàng)目中要生成Excel 并返回
代碼
def file_iterator(file_name, chunk_size=512):'''# 用于形成二進(jìn)制數(shù)據(jù):return:'''with open(file_name, 'rb') as f:while True:c = f.read(chunk_size)if c:yield celse:break返回到前端
def retrieve(self, request, *args, **kwargs):instance = self.get_object()# instance = Design.objects.get(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 xlsxwriterworkbook = xlsxwriter.Workbook(path)worksheet = workbook.add_worksheet("元件")headings = ['名稱', '品牌', '規(guī)格', '數(shù)量']worksheet.write_row("A1", headings)pdetails = Details.objects.filter(design=instance,category__in=(1,2))row = 1for 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 += 1workbook.close() ###### 下面 返回生成的 Excelfile = file_iterator(path)response = StreamingHttpResponse(file)response['Content-Type'] = 'application/txt'# 注意filename 這個是下載后的名字response['Content-Disposition'] = 'attachment;filename="{}"'.format(name)return responseDjango 返回流文件時使用中文文件名的問題
在測試的過程中發(fā)現(xiàn)了一個問題,無論我怎么在響應(yīng)頭中添加 Content-Disposition 指定文件名,在 Chrome 瀏覽器中訪問的時候返回的文件名始終是按 url 的最后一段自動生成的文件名,而將文件名改成英文以后又是正常的。
猜測應(yīng)該是字符串編碼的問題,http 響應(yīng)頭中字符應(yīng)該按照 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)總結(jié)
以上是生活随笔為你收集整理的django 返回文件字节流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ACM 2020 - Text Rec
- 下一篇: Bootstrap智能消息提示框