Question sur la taille/redimensionnement des images uploadées

Après avoir lu ce sujet, celui-ci et encore un autre, je ne suis pas tout à fait sûr de ce que fait Discourse avec les grandes images. Ma compréhension précédente était qu’aucun redimensionnement logiciel n’était effectué, seulement du CSS : la taille de l’image était limitée par maximum image upload size in kB et c’était tout. Si une image plus grande est un fichier distant, elle est liée ; sinon, vous ne pouvez tout simplement pas la télécharger.

Mais maintenant, je suis confus car ces sujets mentionnent le redimensionnement et l’optimisation, ce que je ne pensais pas se produire car je ne l’ai jamais observé en pratique à ma connaissance. Je ne sais pas non plus à quoi s’applique la limite Maximum number of megapixels allowed for an image. Empêche-t-elle le téléchargement d’images plus grandes que cette limite, ou les images dépassant cette limite sont-elles redimensionnées tant qu’elles sont < max upload size ?

Si c’est le second cas, pourquoi le paramètre par défaut pour les mégapixels est-il si énorme par rapport à la taille maximale de téléchargement par défaut ? Il semble extrêmement improbable que quelqu’un veuille publier une image de 51 mégapixels qui soit inférieure à 4096 ko.


Ce que je souhaite, c’est que les utilisateurs puissent télécharger facilement tout ce qu’ils ont sans se soucier des tailles de fichiers et des résolutions, et que le logiciel fournisse quelque chose d’adapté qui ne pénalise pas les utilisateurs mobiles et ceux ayant des connexions plus lentes. Est-ce actuellement possible simplement en ajustant max image size et max megapixels ?

Tout cela fonctionne immédiatement :

Faites un clic droit sur :arrow_double_up: Afficher la source, l’image est petite. Cliquez dessus et vous verrez l’image en pleine résolution.

Donc, si je modifie max upload à 10 Mo et max megapixel à 12, que se passe-t-il lorsqu’un utilisateur tente de télécharger une image de 12 mégapixels qui fait 7 Mo ?

Avec les paramètres par défaut, une proportion significative des photos prises par les téléphones récents dépassent 4096 Ko, mais sont loin d’atteindre 40 mégapixels.

Je ne comprends toujours pas ce qui se passe dans ce cas, ni pourquoi les paramètres par défaut sont définis ainsi.

Je vous recommande de tester les paramètres : modifiez un réglage, téléchargez une image volumineuse et voyez ce qui se passe.

D’accord, je peux faire cela. Cependant, j’aimerais également comprendre ce que le logiciel fait réellement afin de pouvoir prendre des décisions plus éclairées. Depuis que j’utilise Discourse, j’ai appris à respecter les paramètres par défaut et à ne les modifier que lorsque cela est nécessaire. Dans ce cas précis, les paramètres par défaut ne fonctionnent pas très bien pour une communauté assez typique, et je suis curieux de savoir pourquoi ils sont configurés ainsi, quelles valeurs raisonnables je devrais envisager à la place, et ce qui se produira lorsque j’apporterai ces modifications.

En lisant le code, le nombre maximal de mégapixels est une restriction stricte. Il s’agit d’un dispositif de sécurité et non d’un paramètre utilisé par le système pour prendre des décisions concernant le redimensionnement.

max_image_size_kb est le seul facteur déterminant pour le redimensionnement automatique lors du téléchargement.

Augmentez le nombre maximal de mégapixels à la valeur la plus élevée que vous souhaiteriez jamais héberger.

Après avoir appuyé sur plusieurs boutons pendant un moment pour comprendre, voici ce que je pense se passer :

  • Avec une installation par défaut, si client_max_body_size == max image size kb, les images ne seront pas redimensionnées.

  • Augmenter client_max_body_size permettra des uploads plus volumineux, que Discourse tentera ensuite de redimensionner en respectant la limite définie dans max image size kb.

  • Malgré la description qui suggère le contraire, max image size kb ne limite pas réellement la taille des uploads (c’est super confus !).

  • Les tailles d’upload sont uniquement définies par client_max_body_size dans nginx.

  • Lors du redimensionnement, les JPEG restent des JPEG avec de bons résultats.
    Les PNG sont convertis en JPG avec des résultats acceptables.
    Les GIF animés restent des GIF, mais avec des résultats généralement médiocres.

Est-ce tout correct ? Si oui, cela semble être le genre de chose qui devrait être expliqué un peu plus clairement, car une installation standard ne redimensionne aucune image, alors que c’est une fonctionnalité que beaucoup de personnes pourraient souhaiter. De plus, il n’est pas du tout clair, d’après la documentation disponible, comment l’activer.

Hmm, je viens de consulter nginx.sample.conf sur GitHub et il semble que la valeur par défaut de client_max_body_size soit désormais de 10 Mo au lieu de 4 Mo. Est-ce toujours le cas ? Je ne me souviens pas avoir jamais modifié ce fichier sur mon installation avant aujourd’hui.

Merci pour vos tests approfondis avec la version actuelle. Je l’ai vérifié et cela semble fonctionner en pratique exactement comme vous l’avez décrit.

La taille maximale du corps est fixée à 10 depuis un certain temps ; nous devrions probablement l’augmenter à 20.

Je suis d’accord, nous devrions améliorer la description du paramètre du site. Je m’en occuperai plus tard aujourd’hui.

EDIT :

La documentation a été mise à jour selon :

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

Salut Sam, d’après la description, cela ne semble pas fonctionner pour moi :

+ max_image_size_kb : « La taille maximale d’upload d’image en ko. Cela doit également être configuré dans nginx (client_max_body_size) / apache ou un proxy. Les images plus grandes que cette valeur et plus petites que client_max_body_size seront redimensionnées lors de l’upload. »

+ max_image_megapixels : « Nombre maximum de mégapixels autorisé pour une image. Les images ayant un nombre de mégapixels supérieur seront rejetées. »

Ou du moins, aucun redimensionnement ne semble être tenté.

J’avais configuré max_image_size_kb à 1000 ko et une image légèrement supérieure a été remplacée par un lien suivi du texte (image plus grande que 1000 ko).

J’ai modifié le paramètre à 500 ko et la même chose s’est produite.

Je n’ai pas modifié client_max_body_size dans NGINX, car je suppose qu’il est réglé par défaut (4096).

Cela concerne des images hotlinkées, au fait (où, si vous avez coché télécharger les images distantes localement, je suppose que cela devrait être traité comme un upload standard ?). (Si ce n’est pas le cas, pouvons-nous faire en sorte que cela se comporte de la même manière, s’il vous plaît ?)

Édition : Ok, donc l’upload direct et le redimensionnement fonctionnent – super ! Donc, ce sont uniquement les images distantes récupérées qui échouent. Je ne suis pas sûr de quel comportement serait idéal, mais à première vue, je penserais que c’est la même chose : ces images devraient aussi être redimensionnées.

Je pense qu’il s’agit d’une demande de fonctionnalité distincte. Si vous réduisez la taille maximale des images à 200 Ko, il est tout à fait logique de redimensionner les images hotlinkées lors de leur téléchargement. Il y a des seuils à prendre en compte : nous ne devrions pas télécharger une image de 700 Go juste pour en arriver là. Cependant, oui, quelque chose pourrait être amélioré.

Je suis d’accord, Sam. Je ne vois vraiment aucune raison pour laquelle vous ne voudriez pas que les images hotlinkées téléchargées suivent les mêmes règles.


J’ai aussi découvert que si vous modifiez la taille maximale des images, cela a un impact sur la taille finale du fichier obtenu — ce qui est vraiment cool ! En la réglant à 500 Ko, une image de 1,2 Mo a été redimensionnée à 360 Ko, et en la réglant à 200 Ko, le même fichier est passé à 118 Ko :+1: (bien que, bien sûr, l’image soit aussi plus petite).

Édition : Argh, mais nous retrouvons ce problème original : les images trop grandes pour être redimensionnées échouent avec :

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

Je me demande s’il existe un moyen pour que DC effectue toujours un redimensionnement ? Même si l’image se retrouve minuscule ?


C’est le paramètre par défaut sur nos forums. J’ai essayé de le modifier à 20000 et cela a fonctionné (ou semblé rester en place), mais lorsque j’ai essayé de télécharger une image/GIF de 17,2 Mo, j’ai été accueilli par ce message d’erreur :


Pourriez-vous m’indiquer le chemin à suivre (les commandes à entrer) sous Linux pour modifier le “client_max_body_size” dans nginx ? Je suis sur un droplet DigitalOcean.

Cela signifie-t-il que la valeur par défaut sera bientôt changée de 4096 à 20000 ?

Brillant @riking ! Merci, mon pote !

/var/discourse ne contient qu’un dossier partagé. Je ne trouve pas le fichier dont vous parlez. Mon problème est que j’ai une installation Discourse toute neuve et aucun téléchargement d’images dans les messages ne fonctionne. Même en tant qu’administrateur, je reçois l’erreur « Désolé, une erreur s’est produite lors du téléchargement de ce fichier. Veuillez réessayer. » J’ai essayé encore et encore et je reçois toujours la même erreur.

Les journaux d’erreur indiquent :

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-ASN.mmdb) introuvable : No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-ASN.mmdb

Discourse est-il conçu pour être un groupe de discussion « uniquement texte » ? J’ai augmenté tous les paramètres de fichiers pour les tailles de téléchargement maximum à des valeurs énormes et je ne peux même pas télécharger une image de 7 ko.

S’il n’y a rien dans /var/discourse, vous avez peut-être une ancienne installation ; vérifiez également /var/docker.

Hmm, essayez de reconstruire ? Vous pourriez avoir une image de base ancienne qui ne gère pas correctement l’absence de la clé mmdb.

Ok, voici à quoi ressemblent ces dossiers.


Je ne sais pas comment reconstruire. Des conseils, s’il vous plaît ? Il s’agit d’une toute nouvelle installation sur une machine virtuelle et je n’ai eu absolument aucune erreur. Tout semble fonctionner sauf les graphismes.

Comme Jay le demande ici : Uploading Files to Discourse - #3 by pfaffman
Avez-vous effectué une installation standard officielle de Discourse ?