Nginx的X-Accel-Redirect实现大文件下载

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

一、文件下载的几种方式

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低
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值