Django Image Upload ... Предотвращение загрузки огромных файлов - PullRequest
1 голос
/ 24 апреля 2011

Мой сайт использует загруженные пользователем файлы изображений. Я хочу ограничить max_upload_size.

Я знаю, что вы можете установить FILE_UPLOAD_MAX_MEMORY_SIZE в settings.py. Если загружен файл больше этого размера, он записывается на диск в каталоге tmp. Это в значительной степени справляется с вещами? Могут ли огромные изображения по-прежнему влиять на производительность моего сайта?

Одна альтернатива, которую я видел, это настроить max_upload_size в apache, который (кажется) содержится в php.ini. Это звучит правильно? Желательно ли это?

Еще один шаг включает проверку атрибутов Файлового объекта. Я просмотрел этот фрагмент (http://djangosnippets.org/snippets/1303/), в котором представлен метод проверки формы.

def clean_content(self):
   content = self.cleaned_data['content']
   content_type = content.content_type.split('/')[0]
    if content_type in settings.CONTENT_TYPES:
       if content._size > settings.MAX_UPLOAD_SIZE:
          raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.MAX_UPLOAD_SIZE), filesizeformat(content._size)))
    else:
        raise forms.ValidationError(_('File type is not supported'))
    return content

Потенциальные проблемы здесь заключаются в том, что

1) этот код применяется к FileField, а не к ImageField. Я знаю, что ImageField является подклассом FileField, поэтому я предполагаю, что это не проблема. Это правда?

2) Весь запрос HttpRequest читается перед проверкой (поэтому огромные файлы все равно будут проблемой). Кроме того, файл все еще записывается в tmp, даже если он вызывает ошибку проверки?

Наконец, вы также заметите, что эта проверка формы пытается фильтровать типы контента. Я предполагаю, что это в основном бесполезно, так как это просто просмотр расширений, которые можно легко подделать. Это тоже справедливо?

Я знаю, что этот вопрос немного бессвязен, но это сложный и распространенный вопрос (по крайней мере, для меня)

Ответы [ 2 ]

4 голосов
/ 24 апреля 2011

Я знаю, что вы можете установить FILE_UPLOAD_MAX_MEMORY_SIZE в settings.py.Если загружен файл больше этого размера, он записывается на диск в каталоге tmp.Это в значительной степени справляется с вещами?Могут ли огромные изображения по-прежнему влиять на производительность моего сайта?

Зависит от того, что вы подразумеваете под "ручкой".Это позволит процессу обработки загрузки не читать весь файл в память и не использовать ресурсы вашего сервера.Загрузка все равно будет успешной, и вы все равно сохраните «большой» файл.Я думаю, что это может повлиять на производительность вашего сайта, потому что вы будете держать серверный процесс связанным с загрузкой, которая займет больше времени, так как он попадет на диск, что относительно медленно.

Одна альтернатива, которую я видел, это настроить max_upload_size в apache, который (кажется) содержится в php.ini.Это звучит правильно?Это целесообразно?

Есть способ ограничить размер запроса в apache, но это не с помощью этого параметра.Все в php.ini специфично для PHP и не имеет отношения к Django.Вы ищете директиву apache LimitRequestBody .

Вопрос в том, чего вы хотите достичь.Вы хотите ограничить только размер файлов, которые хранит ваш сайт, но вас не волнует, действительно ли они загружены (вас не беспокоит использование полосы пропускания)?Если это так, то вы можете пойти по пути проверки формы, чтобы представить пользователям более приятные ошибки.

Однако, если вам не безразлична полоса пропускания, используемая при больших загрузках, и вы хотите остановить загрузку любого файлапри N МБ вам следует использовать что-то вроде QuotaUploadHandler или установить ограничение через ваш веб-сервер (см. LimitRequestBody выше).Если вы используете обработчик выгрузки, вам нужно будет проверить поведение при возникновении исключения StopUpload - в методе «receive_data_chunk» в документах File Uploads есть небольшой комментарий по этому поводу.Если вы решите позволить apache прекратить загрузку после определенного размера, вы, вероятно, в конечном итоге будете показывать пользователям довольно грубые страницы с ошибками, которые превышают этот предел.

1 голос
/ 10 апреля 2015

Попробуйте код ниже,

from django.core.exceptions import ValidationError
def validate_image(fieldfile_obj):
        filesize = fieldfile_obj.file.size
        megabyte_limit = 2.0
        if filesize > megabyte_limit*1024*1024:
            raise ValidationError("Max file size is %sMB" % str(megabyte_limit))

class User(models.Model):
    avatar = models.ImageField("Avatar", upload_to=upload_logo_to,validators=[validate_image], blank=True, null=True,help_text='Maximum file size allowed is 2Mb')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...