一、文件下载的几种方式
1、直接给出下载地址,使用静态文件服务器nginx下载。任何人都可以下载,无法控制用户的权限。
2、后端流式读取文件内容,设置header后疯狂输出
django文档中提到,可以向HttpResponse传递一个迭代器,流式的向客户端传递数据,如下:
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):
//可做过滤、权限控制等操作
filename = "filename"
response = HttpResponse(read_file(filename))
response['content_type'] = 'application/octet-stream' # 设置头信息,告诉浏览器这是个文件
response['Content-Disposition'] = 'attachment; filename=%s' % filename
return response
这样做可以实现权限的控制,但这个过程需要后端进程将文件读取到内存中然后再发给用户,会造成很大的资源开销。如果你文件较大,可能会超时,并且会占用比较大的内存,当用户下载量很大时有可能造成程序的崩溃。
3、后端过滤与权限控制,再发出指令给web服务器来传输静态文件
Django(做权限判断)+nginx(配合X-Accel-Redirect机制下载文件)
优点:传输快、服务器IO低
<

本文介绍三种文件下载方式,重点探讨X-Sendfile机制及X-Accel-Redirect在Nginx中的应用,通过实例展示如何结合Django实现可控的大文件下载。
最低0.47元/天 解锁文章
387

被折叠的 条评论
为什么被折叠?



