2014-10-08 50 views
1

我主持的Rackspace公司的云文件的一些视频文件,并允许每个用户下载分配给他们的文件。允许用户下载文件没有透露链接,没有缓冲

由于文件的大小是不可行缓冲在网络服务器(webfaction)对象

我试图重定向到文件中,与设置为附接内容处置,但没有成功。

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

理想情况下,文件下载将弹出从我的网域点击指向类似example.com/video/42/download/这样我就可以处理身份验证ECT中的链接后。但我不知道如何构建我的观点,以实现这一点。

回答

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) 

而这会将用户击中该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

+0

我已经使用HttpRedirectResponse,但只是用户直接重定向到rackcdn这是什么样的我想避免的链接。 – apr3ntice 2014-10-09 16:24:42

+0

您可能可以使用'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

相关问题