方式一:读入内存后输出下载
此方式会耗费较大的内存,要服务器崩溃很容易。
def file_download(request): downfilename = "filename.txt" with open('filename.txt') as f: c = f.read() response = HttpResponse(c) response['Content-Type'] = "application/octet-stream" response['Content-Disposition'] = 'attachment;filename="%s.xlsx"' % (quote(downfilename)) return response
方式二:使用迭代器
block_size = 4096 downfilename = request.GET.get("filename", u"比赛排名").encode("utf-8") filelike = file(file_full_path, "rb") response = StreamingHttpResponse() response.streaming_content = iter(lambda: filelike.read(block_size), '') response['Content-Type'] = "application/octet-stream" response['Content-Disposition'] = 'attachment;filename="%s.xlsx"' % (quote(downfilename))
方式三:yield,并使用with处理异常
downfilename = request.GET.get("filename", u"比赛排名").encode("utf-8") def file_iterator(file_name, chunk_size=512): with open(file_name, "rb") as f: while True: c = f.read(chunk_size) if c: yield c else: break response = StreamingHttpResponse() response.streaming_content = file_iterator(file_full_path) response['Content-Type'] = "application/octet-stream" response['Content-Disposition'] = 'attachment;filename="%s.xlsx"' % (quote(downfilename)) return response
注意使用rb方式打开,否则你的Excel将打不开。
相关内容
· Django