2014-10-08 49 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

相關問題