Серверная реализация загрузки изображений в веб-приложении Django (изображения, передаваемые из удаленного местоположения) - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь реализовать на стороне сервера кнопку загрузки для stati c ресурсов (обслуживаемых через AWS S3) в Django веб-приложении.

Что я я пробовал:

Сначала я попробовал атрибут download с тегами a. Но в моем опыте это не покрывает Firefox (т.е. вместо загружаемого ресурса открывается новая вкладка браузера и ресурс отображается в этом окне).

Я попробовал решение на стороне сервера, как только вышеперечисленное не удалось. В частности, в шаблоне html у меня есть:

<form method="GET" action="{% url 'download_image' %}" target="_blank">
    <input type="hidden" name="img_url" value="{{ img_url }}">
    <button>Download</button>
</form>

И в представлении я пытаюсь:

def download_image(request):
    """
    Download the image
    """
    image_url = request.GET.get("img_url",None)
    # image_url value is //s3.eu-central-1.amazonaws.com/my-app/ebc4596f-d7db-340f-b7d6-4952c949f011.jpg
    if image_url:
        with open('https:'+image_url, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type="image/jpg")
            response["Content-Disposition"] = 'attachment; filename="content.jpg"'
            return response

В результате получается IOError:

Нет такого файла или каталога: u 'https://s3.eu-central-1.amazonaws.com/my-app/ebc4596f-d7db-340f-b7d6-4952c949f011.jpg'

Мне кажется, что я делаю что-то в корне неправильно. Может ли эксперт показать мне пример? Заранее спасибо.

1 Ответ

1 голос
/ 08 апреля 2020

open() открывает локальный файл в вашей файловой системе. Для удаленных файлов я предпочитаю requests

import requests


image_response = requests.get(image_url)
if image_response.status_code != requests.status_codes.codes.ok:
    # error handling

response = HttpResponse(image_response.content, content_type=image_response.headers['Content-Type'])
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...