2011-03-23 54 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