Django - файлы большего размера не могут быть загружены на heroku - PullRequest
0 голосов
/ 05 августа 2020

У меня проблемы с отправкой сообщения в приложение django, размещенное на heroku. У меня есть форма, которая отправляет 3 изображения, и все работает нормально, когда я использую изображения меньшего размера размером около 100 КБ, однако, когда я использую более крупные изображения размером ~ 3 МБ, загрузка завершается с ошибкой в ​​журналах heroku, отображаемых как at=error code=H13 desc="Connection closed without response" method=POST path="/"

In django, я просто сохраняю изображения, а затем отправляю их по электронной почте, как показано ниже, где formdata хранит изображения. Надеюсь, этого фрагмента достаточно:

for each in form_data:
    pic = form_data[each]
    if pic:
        filename = os.path.join(self.location,f"{i} - {pic.name}")
        imgbytes = pic.read()
        with open(filename, 'wb+') as destination:
            destination.write(imgbytes)

        i+=1
        fileholder.append(filename)
email = EmailMessage(
        subject = 'Hello',
        body = 'Body goes here',
        from_email = 'example@yahoo.com',
        to = ['test@google.com'],
        )

for each in fileholder:
    email.attach_file(each)
email.attach_file(newpath)
email.send()

Что вызывает это и как я могу убедиться, что изображение любого размера загружено успешно?

Ответы [ 3 ]

0 голосов
/ 05 августа 2020

Насколько мне известно, почти все веб-фреймворки ограничивают размер данных в одном запросе. например Django, Tornado, Spring.

И это небезопасно, если не ограничивать максимальный размер одного запроса.

Как сказано в MSR974, измените DATA_UPLOAD_MAX_MEMORY_SIZE, это способ изменить настройку максимального размера одного запроса. Но в вашем вопросе: убедитесь, что любой размер изображения загружен успешно. Ключевые слова: any size

Попробуйте многостраничную загрузку ?

То есть путем разделения одного файла на два или более файлов и их объединения с порядком после загрузки в бэкэнд. (Надеюсь, я ясно это объяснил)

0 голосов
/ 17 августа 2020

Хорошо, поэтому я обнаружил, что все запросы на heroku будут отключены после 30 секунд c, что и происходило в моем случае. Загрузка занимала больше времени, и мое решение состояло в том, чтобы обработать клиентскую сторону загрузки и вместо этого загрузить ее непосредственно на S3.

Подробнее здесь

0 голосов
/ 05 августа 2020

Django имеет настройки DATA_UPLOAD_MAX_MEMORY_SIZE , которые предотвращают загрузку файла размером более 2,5 МБ (по умолчанию: 2621440 (т.е. 2,5 МБ)) и вызывают исключение SuspiciousOperation (RequestDataTooBig)

Попробуйте изменить его в своем settings.py

...