我在 rackspace 云文件中托管了一些视频文件,每个用户都可以下载分配给他们的文件。
由于文件大小,在网络服务器(webfaction)中缓冲对象是不可行的
我尝试重定向到该文件,并将 Content-Disposition 设置为附件,但无济于事。
如果有的话,我有哪些选择?
理想情况下,在单击指向 example.com/video/42/download/之类的链接后,文件下载会像来 self 的域一样弹出,这样我就可以处理身份验证等。但我不确定如何构建我的观点以实现这一点。
最佳答案
您可能最好使用 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
提供一个 View .
# 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)
这会将点击该 URL 的用户重定向到 Rackspace URL。它可以用于在 html 中嵌入视频、图像等 <img>
标签之类的。浏览器客户端将能够看到重定向的 URL(在 rackcdn.com)。
我已将我的应用配置为服务 temp_url
15 分钟后过期的属性。临时 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
...)。
关于django - 允许用户在不显示链接且不缓冲的情况下下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26266067/