def down(request,operatetype=""):
from cyun import settings
apkpath = os.path.join(settings.APP_STATIC_PATH,'Intelligent_household.ipa')
return big_file_download(request,apkpath,"Intelligent_household.ipa")
def read_file(filename, buf_size=8192):
with open(filename, "rb") as f:
while True:
content = f.read(buf_size)
if content:
yield content
else:
break
def big_file_download(request,apkpath,filename):
response = HttpResponse(read_file(apkpath),content_type='application/octet-stream')
response['Content-Length'] = os.path.getsize(apkpath)
response['Content-Disposition'] = 'attachment; filename=%s' % filename
return response
可以向HttpResponse传递一个迭代器,流式的向客户端传递数据。
这需要使用sendfile的机制:"传统的Web服务器在处理文件下载的时候,总是先读入文件内容到应用程序内存,然后再把内存当中的内容发送给客户端浏览器。这种方式在应付当今大负载网站会消耗更多的服务器资源。sendfile是现代操作系统支持的一种高性能网络IO方式,操作系统内核的sendfile调用可以将文件内容直接推送到网卡的buffer当中,从而避免了Web服务器读写文件的开销,实现了“零拷贝”模式。 "