我在rackspace云文件中托管了一些视频文件,每个用户都可以下载分配给它们的文件。
由于文件大小,在webserver(webfaction)中缓冲对象是不可行的
我尝试重定向到文件,将Content-Disposition设置为附件,但无济于事。
我有什么样的选择,如果有的话?
理想情况下,在点击指向example.com/video/42/download/之类的链接后,文件下载会弹出来自我的域名,因此我可以处理身份验证等。但我不确定如何构建我的观点以实现这一点。
答案 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
...)。