我主持的Rackspace公司的云文件的一些视频文件,并允许每个用户下载分配给他们的文件。允许用户下载文件没有透露链接,没有缓冲
由于文件的大小是不可行缓冲在网络服务器(webfaction)对象
我试图重定向到文件中,与设置为附接内容处置,但没有成功。
我有什么样的选择,如果有的话?
理想情况下,文件下载将弹出从我的网域点击指向类似example.com/video/42/download/这样我就可以处理身份验证ECT中的链接后。但我不知道如何构建我的观点,以实现这一点。
我主持的Rackspace公司的云文件的一些视频文件,并允许每个用户下载分配给他们的文件。允许用户下载文件没有透露链接,没有缓冲
由于文件的大小是不可行缓冲在网络服务器(webfaction)对象
我试图重定向到文件中,与设置为附接内容处置,但没有成功。
我有什么样的选择,如果有的话?
理想情况下,文件下载将弹出从我的网域点击指向类似example.com/video/42/download/这样我就可以处理身份验证ECT中的链接后。但我不知道如何构建我的观点,以实现这一点。
你可能最好通过使用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)
而这会将用户击中该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顶部的任意位置导入此函数将使用新的temp_url
属性(因为我将其分配给models.ImageField
...)延长了ImageField
。
我已经使用HttpRedirectResponse,但只是用户直接重定向到rackcdn这是什么样的我想避免的链接。 – apr3ntice 2014-10-09 16:24:42
您可能可以使用'urllib'和'FileWrapper'的某种组合以8kb大小的方式进行流式传输。 http://blog.ekini.net/2010/10/15/file-streaming-in-django-sending-large-files-through-django/ – pztrick 2014-10-12 00:32:07