перенаправить и принудительно загрузить - PullRequest
3 голосов
/ 24 марта 2011

это моя проблема: у меня есть несколько pdf файлов на сервере, мое веб-приложение Django размещено на другом сервере (не то же самое, что pdf файлы).В моем приложении я знаю ссылку на pdf-файл на другом сервере.Я хочу скачать эти PDF-файлы через мое приложение, не читая их в приложении веб-сервера.

Я пытаюсь объяснить.Если я нажму на ссылку для скачивания, мой браузер покажет PDF-файл во внутренней программе просмотра PDF.Я не хочу этого, я хочу, чтобы при нажатии на кнопку пользователь загружал файл, не открывая его во внутреннем браузере.

Я посмотрел здесь: http://docs.djangoproject.com/en/dev/ref/request-response/#telling-the-browser-to-treat-the-response-as-a-file-attachment но это не очень хороший способ для меня, потому что он требует, чтобы я прочитал файл в своем веб-приложении и после его возврата пользователю.

Возможно ли это?

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Хм, звучит как не тот инструмент для работы.Вы не можете «перенаправить» и изменить заголовок ответа, что означает, что использование django просто для установки заголовка Content-Disposition потребует от вас потоковой передачи файла через django, а затем передачи потока django клиенту.

Позвольте легкому веб-серверу справиться с этим.Если вы используете nginx, вот замечательное решение , которое соответствует вашему сценарию на 99% (1% - это рельсы, устанавливающие заголовок, которого ждет nginx).

Если всехочу установить заголовок, и файл не нуждается в обработке django, прокси будет еще проще!

Если вы не используете nginx, я бы изменил заголовок на вопрос веб-сервера о проксировании файла и настройке заголовков.

0 голосов
/ 12 апреля 2017

У меня недавно была похожая проблема. Я решил, загрузив файл на свой сервер и записав его на 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 
...