允许用户在不泄露链接且无缓冲的情况下下载文件

时间:2014-10-08 20:41:53

标签: django http rackspace

我在rackspace云文件中托管了一些视频文件,每个用户都可以下载分配给它们的文件。

由于文件大小,在webserver(webfaction)中缓冲对象是不可行的

我尝试重定向到文件,将Content-Disposition设置为附件,但无济于事。

我有什么样的选择,如果有的话?

理想情况下,在点击指向example.com/video/42/download/之类的链接后,文件下载会弹出来自我的域名,因此我可以处理身份验证等。但我不确定如何构建我的观点以实现这一点。

1 个答案:

答案 0 :(得分:0)

使用HttpResponseRedirect可能是最好的服务,除非我有误解的事情......?

# urls.py
from django.http import HttpResponseRedirect
url(r'^applications/(?P<id>\d+)/image\.png$', 'core.views.serve_image', name='image'),

这将在http://localhost/application/12345/image.png处提供一个视图。

# core/views.py

def serve_application_image(request, id):
    # redirect to temp_url
    application = Application.objects.get(id=id)
    return HttpResponseRedirect(application.image.temp_url)

这会将点击该网址的用户重定向到Rackspace网址。它可以用于在html <img>标签等中嵌入视频,图像等。浏览器客户端能够看到重定向的URL(在rackcdn.com上)。


我已将我的应用配置为提供在{15}分钟后过期的temp_url媒体资源。临时URL是为Rackspace.com上的CDN创建的,他们的文档可能超出了这个问题的范围,所以我暂时将其关闭...但是我用于子类ImageField的代码使用.temp_url代码提供图像属性如下:

import hmac
from hashlib import sha1
from time import time
class ImageFieldFile_With_Temp_Url(ImageFieldFile):
    @property
    def temp_url(self):

        container_name, file_name = (self.storage.container.name, self.name)

        key = settings.CUMULUS['CUSTOM__X_ACCOUNT_META_TEMP_URL_KEY']
        public_url = settings.CUMULUS['CUSTOM__X_STORAGE_URL']
        method = 'GET'
        expires = int(time() + settings.CUMULUS['CUSTOM__X_TEMP_URL_TIMEOUT'])

        url = '%s/%s/%s' % (public_url, container_name, file_name)
        base_url, object_path = url.split('/v1/')
        object_path = '/v1/' + object_path

        hmac_body = '%s\n%s\n%s' % (method, expires, object_path)
        sig = hmac.new(key, hmac_body, sha1).hexdigest()
        return '%s%s?temp_url_sig=%s&temp_url_expires=%s' % (base_url, object_path, sig, expires)

class ImageField_With_Temp_Url(models.ImageField):
    attr_class = ImageFieldFile_With_Temp_Url
models.ImageField = ImageField_With_Temp_Url

请注意,我正在使用此方法中的django-cumulus项目。

在models.py顶部的任意位置导入此函数会使用新的ImageField属性扩展temp_url(因为我将其分配给models.ImageField ...)。

相关问题