2011-03-23 52 views
3

這是我的問題:我有一些服務器上的pdf文件,我的Django網絡應用程序 託管在另一臺服務器(不一樣的pdf文件)。 在我的應用程序,我知道另一臺服務器上的PDF文件鏈接。我想通過我的應用程序下載該pdf文件,而無需在Web服務器應用程序中閱讀它們。重定向和強制下載

我嘗試解釋。如果我點擊下載鏈接,我的瀏覽器將pdf顯示到他的內部PDF查看器中。我不想要這個,我想要點擊一個按鈕,用戶將下載文件而不用在內部瀏覽器上打開它。

我看了這裏:http://docs.djangoproject.com/en/dev/ref/request-response/#telling-the-browser-to-treat-the-response-as-a-file-attachment 但這對我來說並不是一個好的方法,因爲它要求我讀取我的web應用程序內部的文件,並在返回給用戶之後。

有沒有可能?

+0

也許你的用戶會喜歡它,如果你讓他們決定他們想如何查看PDF?瀏覽器有文件 - >保存,如果他們想在本地存儲它。 – 2011-03-28 04:50:11

回答

3

嗯,聽起來像是工作的錯誤工具。你不能真正的「重定向」和修改響應頭,這意味着使用django來設置Content-Disposition頭將需要你通過django流文件,然後讓django把它流到客戶端。

讓輕量級的Web服務器處理該問題。如果你碰巧使用nginx,here's an awesome solution,它適合你的場景的99%(1%是它的rails設置nginx正在等待的標題)。

如果你想要設置標題和文件不需要Django處理,它將更容易代理!

如果您不使用nginx,我會將標題更改爲關於代理文件&設置標題的Web服務器特定問題。

+0

謝謝你的回覆。是對的我沒有使用nginx,我的應用程序託管在谷歌應用程序引擎上,我改變了標題。抱歉。但是,我認爲這是不可能解決我的問題,閱讀您的答覆後,我確信沒有辦法獲得我需要的東西。 也許會存在任何JavaScript技巧來做我所需要的? – Codename47 2011-03-26 01:24:46

+0

No javascript。我聽說過某些瀏覽器可以使用的黑客方式,但是爲了保持一致的防彈性,您必須設置只能通過服務器完成的標頭。那麼,在你的情況下,我並不知道谷歌應用程序引擎是如何工作的,但如果你可以暫時下載文件,我想你可以通過django來完成。我無法想象在嘗試同時流入IN和OUT時是否存在任何問題,但是您可以將其保存爲臨時文件,然後在相當長的時間內將文件提供給客戶端,前提是Google擁有快速進/出帶寬 – 2011-03-26 04:30:15

+0

我會環顧四周,看是否可以在appengine中設置標頭 - 我幾乎不知道appengine的線索。 – 2011-03-26 04:30:48

0

我最近有類似的問題。我已經解決了它下載文件到我的服務器,然後將其寫入HttpResponse 這裏是我的代碼:

import requests 
from wsgiref.util import FileWrapper 
from django.http import Http404, HttpResponse 

def startDownload(): 
    url, filename, ext = someFancyLogic() 
    request = requests.get(url, stream=True) 

    # Was the request OK? 
    if request.status_code != requests.codes.ok: 
     return HttpResponse(status=400) 

    wrapper = FileWrapper(request.raw) 
    content_type = request.headers['content-type'] 
    content_len = request.headers['content-length'] 

    response = HttpResponse(wrapper, content_type=content_type) 
    response['Content-Length'] = content_len 
    response['Content-Disposition'] 
     = "attachment; filename={0}.{1}".format(filename, ext) 
    return response