Вопрос о размере/изменении размера загружаемого изображения

Прочитав эту тему, эту и эту, я до сих пор не до конца понимаю, что именно Discourse делает с большими изображениями. Раньше я думал, что программное изменение размера не выполняется, а используется только CSS: размер изображения ограничивался параметром «Максимальный размер загружаемого изображения (в КБ)», и всё. Если изображение было больше и находилось по удалённой ссылке, просто добавлялась ссылка на него; в противном случае загрузка была невозможна.

Однако теперь я запутался, так как в этих темах упоминаются уменьшение размера и оптимизация, чего, как мне казалось, не происходит, потому что я никогда этого не наблюдал на практике. Кроме того, я не понимаю, к чему применяется ограничение «Максимальное количество мегапикселей для изображения». Оно предотвращает загрузку изображений большего размера или изображения, превышающие этот лимит, автоматически уменьшаются, если их размер меньше max upload size?

Если верно второе, то почему значение по умолчанию для мегапикселей настолько велико по сравнению с максимальным размером загрузки по умолчанию? Крайне маловероятно, что кто-то захочет опубликовать изображение в 51 мегапиксель, размер файла которого меньше 4096 КБ.


Моя цель — чтобы пользователи могли удобно загружать любые изображения, не беспокоясь о размере файла и разрешении, а программное обеспечение автоматически предоставляло бы подходящий вариант, который не создаёт проблем для мобильных пользователей и людей с медленным интернетом. Возможно ли это сейчас просто путём настройки параметров max image size и max megapixels?

Всё это работает из коробки:

Щёлкните правой кнопкой мыши на :arrow_double_up: «Просмотреть исходный код» — изображение маленькое. Щёлкните на него, и вы увидите изображение в полном разрешении.

Так что, если я изменю max upload на 10 МБ и max megapixel на 12, что произойдёт, если пользователь попытается загрузить изображение в 16 мегапикселей размером 7 МБ?

При настройках по умолчанию значительный процент снимков, сделанных на более новые телефоны, превышает 4096 КБ, но далеко не достигает 40 мегапикселей.

Я всё ещё не понимаю, что происходит в таком случае, и почему значения по умолчанию установлены именно так.

Рекомендую поэкспериментировать с настройками: измените одну из них, загрузите большое изображение и посмотрите, что произойдёт.

Хорошо, я могу это сделать. Однако я также хочу понять, что именно делает программное обеспечение, чтобы принимать более обоснованные решения. За время использования Discourse я научился уважать настройки по умолчанию и менять их только при необходимости. В данном случае настройки по умолчанию работают не очень хорошо для довольно типичного сообщества, и мне интересно, почему они установлены именно так, какие разумные значения мне следует рассмотреть вместо них и что произойдет, когда я внесу эти изменения.

При чтении кода видно, что максимальное количество мегапикселей — это жёсткое ограничение. Это предохранительный механизм, а не параметр, который система использует для принятия решений об уменьшении размера изображения.

max_image_size_kb — единственный фактор, определяющий автоматическое уменьшение размера при загрузке.

Увеличьте максимальное количество мегапикселей до абсолютного максимума, который вы когда-либо захотите размещать на хостинге.

После того как я понажимал кнопки какое-то время, чтобы разобраться, вот что, как мне кажется, происходит:

  • При стандартной установке, если client_max_body_size == max image size kb, изображения не будут изменяться в размере.

  • Увеличение client_max_body_size позволит загружать файлы большего размера, после чего Discourse попытается изменить их размер в соответствии с пределом, установленным в max image size kb.

  • Несмотря на описание, которое подразумевает обратное, max image size kb на самом деле не ограничивает размер загружаемых файлов (это очень запутанно!)

  • Размер загружаемых файлов определяется исключительно параметром client_max_body_size в nginx.

  • При изменении размера:

    • JPEG-файлы остаются JPEG-файлами с хорошим результатом.
    • PNG-файлы конвертируются в JPG с приемлемым результатом.
    • Анимированные GIF-файлы остаются GIF-файлами, но результат, как правило, неважный.

Правильно ли я всё понял? Если да, то это кажется тем, что стоило бы объяснить немного подробнее, поскольку установка «из коробки» не выполняет никакого изменения размера изображений, хотя это функция, которая может понадобиться многим пользователям, и из доступной документации совершенно непонятно, как её включить.

Хм, я только что посмотрел файл nginx.sample.conf на GitHub, и кажется, что значение по умолчанию для client_max_body_size теперь составляет 10 МБ, а не 4 МБ. Так было всегда? Я не помню, чтобы вносил какие-либо изменения в этот файл на своей установке до сегодняшнего дня.

Спасибо за тщательное тестирование с текущей версией. Я проверил, и на практике это работает именно так, как вы описали.

Максимальный размер тела уже давно составляет 10, вероятно, стоит увеличить его до 20.

Согласен, что нужно улучшить описание настройки сайта, сделаю это сегодня позже.

РЕДАКТИРОВАНИЕ:

Документация обновлена согласно:

https://review.discourse.org/t/doc-improve-documentation-of-image-limit-site-settings/9303

Привет, Сэм, судя по описанию, у меня это не работает:

+ max_image_size_kb: "Максимальный размер загружаемого изображения в КБ. Это также должно быть настроено в nginx (client_max_body_size) / Apache или прокси. Изображения, размер которых превышает это значение, но меньше client_max_body_size, будут изменены при загрузке.

+ max_image_megapixels: “Максимальное количество мегапикселей, разрешённое для изображения. Изображения с большим количеством мегапикселей будут отклонены.”

По крайней мере, попыток изменения размера не наблюдается.

У меня max_image_size_kb был установлен на 1000 КБ, и изображение, немного превышающее этот размер, было заменено ссылкой, за которой следовал текст (изображение больше 1000 КБ).

Я изменил настройку на 500 КБ, и произошло то же самое.

Я не менял client_max_body_size в NGINX, так как предполагаю, что там установлено значение по умолчанию (4096).

Кстати, это касается изображений с горячей ссылкой; я предполагаю, что если включена опция скачивать удалённые изображения локально, они должны обрабатываться как стандартная загрузка? (Если нет, можно ли заставить их вести себя аналогично, пожалуйста?)

Редактирование: Хорошо, при прямой загрузке изменение размера работает — отлично! Значит, проблема только в удалённых изображениях, которые загружаются. Честно говоря, не уверен, какое поведение было бы идеальным, но на первый взгляд я бы подумал, что и эти изображения тоже должны изменяться в размере.

Я думаю, что это отдельный запрос на новую функцию. Конечно, если вы уменьшите максимальный размер изображения до 200 КБ, то имеет смысл просто изменять размер ссылок на изображения при их загрузке. Существуют определенные пороги: мы не должны загружать изображение размером 700 ГБ только для того, чтобы это выяснить, но да, кое-что можно было бы улучшить.

Я согласен с вами, Сэм. Честно говоря, не могу придумать ни одной причины, по которой загруженные изображения по горячим ссылкам не должны следовать тем же правилам.


Также я только что обнаружил, что изменение максимального размера изображения действительно влияет на итоговый размер файла — это действительно круто! Установка значения 500 КБ привела к изменению размера изображения 1,2 МБ до 360 КБ, а установка 200 КБ дала тот же файл размером 118 КБ :+1: (хотя, очевидно, оно стало и меньше по размерам).

Редактирование: Ах, но мы снова сталкиваемся с той же проблемой — изображения, которые слишком велики для изменения размера, завершаются с ошибкой:

lib/discourse.rb:57:in `exec': convert: improper image header `/tmp/image20200228-23391-t365z9.jpg' @ error/png.c/ReadPNGImage/4294.

Интересно, есть ли способ заставить DC всегда выполнять изменение размера? Даже если изображение в итоге оказывается крошечным?


Это настройка по умолчанию на наших форумах. Я попытался изменить её на 20000, и это сработало (или, по крайней мере, применилось), но когда я загрузил изображение/GIF размером 17,2 МБ, получил это сообщение об ошибке:


Подскажите, пожалуйста, какой путь нужно указать (какие команды ввести) в Linux, чтобы изменить параметр “client_max_body_size” в nginx? Я использую Droplet от DigitalOcean.

Означает ли это, что значение по умолчанию скоро будет изменено с 4096 на 20000?

Блестяще, @riking! Спасибо, дружище!

В /var/discourse есть только общая папка. Я не могу найти указанный вами файл. Моя проблема в том, что у меня совершенно новая установка Discourse, и загрузка изображений в сообщениях вообще не работает. Даже как администратор, я получаю ошибку: «К сожалению, произошла ошибка при загрузке файла. Пожалуйста, попробуйте снова». Я пробовал много раз, но получаю ту же ошибку.

В логах ошибок указано:

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-ASN.mmdb) не найден: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-ASN.mmdb

Предназначен ли Discourse для работы только как текстовый форум? Я увеличил все настройки файлов для максимальной загрузки до безумных размеров, но не могу загрузить даже графический файл размером 7 КБ.

Если в /var/discourse ничего нет, возможно, у вас более старая установка; проверьте также /var/docker.

Хм, попробуйте пересобрать? Возможно, у вас старый базовый образ, который некорректно обрабатывал отсутствие ключа mmdb.

Хорошо, вот как выглядят эти папки.


Не уверен, как выполнить пересборку. Пожалуйста, дайте рекомендации? Это совершенно новая установка на виртуальной машине, и я не получил никаких ошибок. Всё работает, кроме графики.

Как спрашивает Джей здесь: Uploading Files to Discourse - #3 by pfaffman
Вы выполнили стандартную официальную установку Discourse?