这是我的问题:我在服务器上有一些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 但这对我来说不是一个好方法,因为它要求我在我的网络应用程序中读取文件并将其返回给用户。
有可能吗?
答案 0 :(得分:3)
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