重定向和强制下载

时间:2011-03-23 22:12:06

标签: django google-app-engine attachment custom-headers

这是我的问题:我在服务器上有一些pdf文件,我的Django网络应用程序 托管在另一台服务器上(与pdf文件不同)。 在我的appplication上,我知道另一台服务器上的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 但这对我来说不是一个好方法,因为它要求我在我的网络应用程序中读取文件并将其返回给用户。

有可能吗?

2 个答案:

答案 0 :(得分:3)

嗯,听起来像是工作的错误工具。你不能真正“重定向”并修改响应头,这意味着使用django只是为了设置Content-Disposition标头需要你通过django流式传输文件,然后让django将它流式传输到客户端。

让轻量级的Web服务器处理它。如果您正好使用nginx,here's an awesome solution适合您的场景99%(1%是它的rails设置nginx正在等待的标头)。

如果您只想设置标题并且文件不需要django处理,那么代理就更容易了!

如果您没有使用nginx,我会将标题更改为关于代理文件的Web服务器特定问题&设置标题。

答案 1 :(得分: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