图片上传大小/调整尺寸问题

在阅读了 这个主题这个主题 以及 这个主题 后,我对 Discourse 如何处理大图片仍不太确定。我之前的理解是:Discourse 不会进行软件层面的缩放,仅通过 CSS 控制显示;图片大小仅受“最大图片上传大小(kB)”限制,仅此而已。如果是远程文件,则直接链接;否则无法上传。

但现在我有些困惑,因为这些主题提到了缩小尺寸和优化,而我之前从未认为会发生这种情况,因为我从未在实际使用中注意到这一点。我也不清楚“允许的图片最大像素数”这个限制具体适用于什么情况。这是阻止上传超过该像素值的图片,还是只要图片小于“最大上传大小”,超出像素限制的图片就会被自动调整大小?

如果是后者,为什么默认设置的像素上限相对于默认的最大上传大小如此巨大?似乎极不可能有人想上传一张 5100 万像素但小于 4096 kB 的图片。


我的需求是:让用户能够方便地上传他们拥有的任何图片,而无需担心文件大小和分辨率;同时让软件自动提供合适的版本,避免拖慢移动用户或网络较慢的用户。目前是否只需调整“最大图片大小”和“最大像素数”即可实现这一目标?

4 个赞

这一切开箱即用:

右键点击 :arrow_double_up: 查看源代码,图片体积很小。点击它即可看到完整分辨率的图片。

5 个赞

那么,如果我将 max upload 改为 10 MB,将 max megapixel 改为 12,当用户尝试上传一张 1600 万像素、7 MB 的图片时会发生什么?

在默认设置下,较新手机拍摄的照片中,有相当大一部分的体积超过 4096 kB,但远未达到 4000 万像素。

我仍然不太明白具体会发生什么情况,也不清楚为什么默认值要设置为当前的数值。

1 个赞

我建议尝试调整设置:更改一项设置,上传一张超大图片,看看会发生什么。

3 个赞

好的,我可以做到。不过,我也想了解软件实际在做什么,以便做出更明智的决策。在我使用 Discourse 的这段时间里,我学会了尊重默认设置,仅在必要时进行修改。但在这种情况下,默认设置对于相当典型的社区来说效果并不理想。我很好奇它们为何如此设定,有哪些合理的替代值值得考虑,以及做出这些更改后会发生什么。

1 个赞

阅读代码可知,最大像素数是一个硬性限制。它是一个安全开关,并非系统用于决定是否需要缩小图像的依据。

max_image_size_kb 是上传时自动缩放的唯一决定因素。

请将最大像素数提高到您希望托管的绝对最大值。

3 个赞

在胡乱按了一阵按钮摸索了一番后,我认为情况是这样的:

  • 在默认安装中,若 client_max_body_size 等于 max image size kb,图片将不会被调整大小。

  • 增大 client_max_body_size 将允许上传更大的文件,Discourse 随后会尝试将其调整至 max image size kb 所设定的限制内。

  • 尽管描述暗示了相反的情况,但 max image size kb 实际上并不限制上传大小(这非常令人困惑!)

  • 上传大小完全由 nginx 的 client_max_body_size 设置。

  • 在调整大小时:

    • JPEG 保持为 JPEG,效果良好;
    • PNG 被转换为 JPG,效果可接受;
    • 动图 GIF 保持为 GIF,但效果通常较差。

以上说法都正确吗?如果是的话,这似乎是需要更清楚说明的内容,因为开箱即用的安装并不会对图片进行任何调整,尽管这是许多人可能需要的功能,而且现有文档中完全不清楚如何启用它。

6 个赞

嗯,我刚刚在 GitHub 上查看了 nginx.sample.conf,发现 client_max_body_size 的默认值现在是 10 MB,而不是 4 MB。一直都是这样吗?我不记得在今天之前对我的安装中的该文件做过任何修改。

3 个赞

感谢您对当前版本进行 thorough 测试。我已检查过,实际运行情况正如您所描述的那样。

1 个赞

最大图片尺寸限制长期以来一直是 10,我们或许应该将其提高到 20。

同意我们应该改进站点设置的描述,今天晚些时候会进行更新。

编辑:

文档已根据以下内容更新:

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

13 个赞

嗨,Sam,根据描述,这对我来说似乎不起作用:

  • max_image_size_kb: “上传图片的最大尺寸(单位:kB)。此设置也需在 nginx(client_max_body_size)、Apache 或代理中进行配置。大于此值但小于 client_max_body_size 的图片在上传时会被调整大小以适应要求。”
  • max_image_megapixels: “图片允许的最大像素数(单位:兆像素)。像素数超过此值的图片将被拒绝。”

至少看起来没有尝试进行任何调整大小操作。

我将 max_image_size_kb 设置为 1000kb,一张略大于该值的图片被替换为链接,并附带了文字 (image larger than 1000KB)(图片大于 1000KB)。

我将设置改为 500kb,但同样的情况再次发生。

我没有更改 NGINX 中的 client_max_body_size,因为我假设它仍为默认值(4096)。

顺便提一下,这些是热链接的图片。我假设如果勾选了“将远程图片下载到本地”选项,它们应该被视为标准上传处理?(如果不是,能否让它表现一致呢?)

编辑:好的,直接上传时调整大小功能确实有效——太好了!所以问题仅出在获取远程图片时。说实话,我不确定理想的行为应该是什么,但第一反应是:这些图片也应该被调整大小。

4 个赞

我认为这是一个独立的功能请求。当然,如果您将最大图片尺寸限制降至 200KB,那么在我们下载热链接图片时直接调整其大小就完全合理了。这里存在一些阈值限制,我们不应该为了验证这一点而下载一个 700GB 的图片,但确实有些地方可以做得更好。

5 个赞

我同意 Sam 的看法。说实话,我想不出任何理由不支持让下载的热链接图片遵循相同的规则。


我还刚发现,如果你更改最大图片尺寸限制,这实际上会影响最终生成的文件大小——这真的很棒!将其设置为 500KB 时,原本 1.2MB 的图片被压缩到了 360KB;设置为 200KB 时,同一张图片则变成了 118KB :+1:(当然,图片尺寸也变小了)。

编辑:啊,但我们又遇到了那个老问题——对于那些因过大而无法重调整尺寸的图片,会报错:

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

我在想,DC 是否有一种方法可以始终执行重调整尺寸操作?即使最终图片变得非常小?

4 个赞


这是我们论坛的默认设置。我尝试将其更改为 20000,并且似乎生效了,但当我尝试上传一个 17.2MB 的图片/GIF 时,却收到了以下错误信息:


请问在 Linux 中,我需要进入哪个路径(执行哪些命令)来修改 nginx 中的 “client_max_body_size”?我使用的是 DigitalOcean Droplet。

这是否意味着默认值很快将从 4096 更改为 20000?

4 个赞
4 个赞

太棒了 @riking!谢了,伙计!

1 个赞

/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 是否被设计为仅支持文本的讨论组?我已经将最大上传大小等文件设置调到了极不合理的数值,但连一个 7KB 的图片都无法上传。

1 个赞

如果 /var/discourse 中没有任何内容,您可能使用的是较旧的安装版本,请同时检查 /var/docker

嗯,尝试重新构建一下?您可能使用了未正确处理 mmdb 键缺失情况的旧基础镜像。

2 个赞

好的,这些文件夹看起来是这样的。


我不确定如何重建。请提供指导?这是在虚拟机上全新安装的,我完全没有遇到任何错误。除了图形显示外,其他一切似乎都正常工作。

1 个赞

正如 Jay 在此处所问:Uploading Files to Discourse - #3 by pfaffman
您是否进行了 Discourse 官方标准安装

1 个赞