# 在 oneboxes 中下载 .webp 图片的功能已失效

**URL:** <https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602>\
**Category:** Bug\
**Created:** [2020年二月12日 08:10 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602 "2020-02-12T08:10:55Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)\
**Post date:** [2020年二月12日 08:10 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/1 "2020-02-12T08:10:55Z")

</div>

看起来在一键框中下载图片的功能已损坏。这可能是由于一键框或安全媒体最近的变化导致的回归问题。@vinothkannans 能否请您查看一下？

示例：一键框 `https://www.samsung.com/us/mobile/galaxy-z-flip` 未显示图片，因为图片是通过 HTTP 加载的。

> **[Galaxy Z Flip3 5G | Samsung US](https://www.samsung.com/us/smartphones/galaxy-z-flip3-5g/)**
>
> For those who love the Galaxy Z Flip3, check out the next generation of the Z Flip series with new and improved features.

---

<div class="post-metadata">

**Author:** ![vinothkannans](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/vinothkannans/32/86465_2.png) [@vinothkannans](https://meta.discourse.org/u/vinothkannans)\
**Post date:** [2020年二月20日 19:38 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/3 "2020-02-20T19:38:56Z")

</div>

问题在于从 URL “`http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg`” 下载 onebox 图片时，返回的文件格式为 “`.webp`”（samsung-logo-191-1.webp）。因此我们无法下载该文件，因为 “`.webp`” 格式未在我们 `authorized_extensions` 站点设置中列入白名单。

由于 favicon 是 “`.ico`” 文件，因此未被下载。我们是否应在 onebox 中默认允许 “ico” 文件？

---

<div class="post-metadata">

**Author:** ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)\
**Post date:** [2020年二月20日 20:00 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/4 "2020-02-20T20:00:36Z")

</div>

我在想，WebP 是否只是因为使用了 Chrome 用户代理才出现的 🤔

---

<div class="post-metadata">

**Author:** ![vinothkannans](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/vinothkannans/32/86465_2.png) [@vinothkannans](https://meta.discourse.org/u/vinothkannans)\
**Post date:** [2020年二月20日 20:14 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/5 "2020-02-20T20:14:40Z")

</div>

我不这么认为。即使我在 Firefox 中手动下载，它返回的仍然是 webp 文件。

---

<div class="post-metadata">

**Author:** ![jamie.wilson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jamie.wilson/32/185466_2.png) [@jamie.wilson](https://meta.discourse.org/u/jamie.wilson)\
**Post date:** [2020年七月6日 15:51 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/6 "2020-07-06T15:51:07Z")

</div>

在我的 Firefox 版本（MacOS 上的 77.0.1 (64 位)）中，上述 URL 请求的 `Accept` 头为：

```plaintext
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

```

（即，浏览器请求如果可用则返回 image/webp 格式）

而 Safari 的 `Accept` 头为：

```plaintext
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

```

三星 Web 服务器返回的是 JPEG 格式。Onebox 在 Safari 中显示正确（包含图片）。

---

<div class="post-metadata">

**Author:** ![jamie.wilson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jamie.wilson/32/185466_2.png) [@jamie.wilson](https://meta.discourse.org/u/jamie.wilson)\
**Post date:** [2020年十一月13日 17:36 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/9 "2020-11-13T17:36:33Z")

</div>

三星正在使用 [Akamai Image Manager](https://community.akamai.com/customers/s/article/Akamai-Introduces-New-Image-Optimization-Service-Image-Manager?language=en_US) 来提供这些文件。

如果我传递一个 `Accept` 头为 `image/jpeg,image/gif`，它确实会返回 `image/jpeg`，符合预期。

```plaintext
wget --header="Accept: image/jpeg,image/gif" http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg

--2020-11-13 11:43:58-- http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
Resolving image-us.samsung.com (image-us.samsung.com)... 23.217.144.69
Connecting to image-us.samsung.com (image-us.samsung.com)|23.217.144.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 83094 (81K) [image/jpeg]
Saving to: ‘samsung-logo-191-1.jpg.6’

```

Discourse 尝试通过调用 `FileHelper.download` 来获取图像，该函数会调用 `FinalDestination.get`，最终使用以下 `UserAgent` 请求文件：

`Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36`

因此，如果我们使用与上述相同的 `Accept` 头请求同一张图像，并添加该用户代理，结果如下：

```plaintext
wget --header="Accept: image/jpeg,image/gif" --header="User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg

--2020-11-13 11:52:50-- http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
Resolving image-us.samsung.com (image-us.samsung.com)... 23.217.144.69
Connecting to image-us.samsung.com (image-us.samsung.com)|23.217.144.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 45540 (44K) [image/webp]
Saving to: ‘samsung-logo-191-1.jpg.10’

```

返回的是 `image/webp`。看起来他们忽略了 `Accept` 头，而是根据用户代理使用自己的逻辑来确定最佳文件类型。

苹果历史上并不支持 WebP，因此让我们试试：

```plaintext
wget --header="Accept: image/jpeg,image/gif" --header="User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15" http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg

--2020-11-13 12:27:02-- http://image-us.samsung.com/SamsungUS/home/samsung-logo-191-1.jpg
Resolving image-us.samsung.com (image-us.samsung.com)... 23.217.144.69
Connecting to image-us.samsung.com (image-us.samsung.com)|23.217.144.69|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 83094 (81K) [image/jpeg]
Saving to: ‘samsung-logo-191-1.jpg.16’

```

成功了！

我认为可以有力地论证，Web 服务器应始终尊重 `Accept` 头，而不要试图“超越”它。另一方面，也有人可能会争辩说，如果你提供了特定的用户代理字符串，就应该准备好表现得像该用户代理（尽管用户代理伪装并不罕见，且有多种用途）。

事实上，苹果已在最近发布的 iOS 14 和昨天发布的 macOS Big Sur 中 [添加了对 WebP 的支持](https://9to5mac.com/2020/06/24/apple-adds-webp-hdr-support-and-more-to-safari-with-ios-14-and-macos-big-sur/)，因此我们可能应该支持它（将其添加为默认允许的扩展名），并配置 ImageMagick 以支持它（这将引入对 libwebp 或类似库的依赖），以便我们能够对其进行优化和调整大小等操作。

---

<div class="post-metadata">

**Author:** ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)\
**Post date:** [2020年十一月15日 23:42 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/10 "2020-11-15T23:42:25Z")

</div>

Akami 的这种行为太糟糕了，天哪。

随意更改我们的伪装 User-Agent 是否很简单？无论如何，我们都不应该伪装成 2017 年发布的 Chrome 58。

@evitrout 应该完全了解 Discourse 为何要伪装，以及为何不使用专为 Discourse 设计的特殊 User-Agent。我模糊的记忆是，如果我们不伪装，有些人会拒绝我们下载图片和 onebox。我们可以：

1. 检查情况是否已发生变化，然后尝试使用我们自己的 User-Agent。
2. 将我们的伪装 User-Agent 升级到最新版的 Chrome。
3. 切换到 macOS 上不支持 WebP 的 Safari 版本。

此外，我们或许可以在文件下载后允许进行“透明”的 WebP 到 JPEG 转换，这样即使网站运营方不完全支持，我们仍然可以代理不兼容的图片。（这对于其他一些生僻的图片格式也可能很有用）

或者，我们干脆继续前进，默认支持 WebP，并将其添加到所有默认设置中？（我想知道现在是否还为时过早）

---

<div class="post-metadata">

**Author:** ![eviltrout](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/eviltrout/32/5275_2.png) [@eviltrout](https://meta.discourse.org/u/eviltrout)\
**Post date:** [2020年十一月16日 17:57 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/11 "2020-11-16T17:57:15Z")

</div>

> [@sam](#):
>
> 应该充分了解 Discourse 为何假装使用一个专为 Discourse 设计的特殊用户代理，而实际上并未使用。我模糊地记得，如果我们不“假装”，有些人就会阻止我们下载图片和一框（oneboxes）。

不幸的是，许多网站除非请求看起来来自浏览器，否则不会提供正确的内容。我怀疑，如果我们更改这一点，大多数来源会正常工作，但有一两个可能会出现异常。

一框（Onebox）往往是一场“打地鼠”游戏：修复了一个问题，另一个问题又会在别处冒出来。

---

<div class="post-metadata">

**Author:** ![riking](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/riking/32/170938_2.png) [@riking](https://meta.discourse.org/u/riking)\
**Post date:** [2020年十一月16日 20:00 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/12 "2020-11-16T20:00:29Z")

</div>

> [@sam](#):
>
> 或者我们直接继续推进，默认支持 WebP 并将其添加到所有默认设置中？（我想知道现在是否还为时过早）

既然苹果已经妥协，在 Safari 和 iOS 中增加了对 WebP 的支持，看来现在是采取这一行动的正确时机。

---

<div class="post-metadata">

**Author:** ![jamie.wilson](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jamie.wilson/32/185466_2.png) [@jamie.wilson](https://meta.discourse.org/u/jamie.wilson)\
**Post date:** [2021年二月11日 21:26 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/13 "2021-02-11T21:26:43Z")

</div>

> <https://github.com/discourse/discourse/commit/32e7ee4867e3ea557ea5e55886b9b94a624b2c30>
>
> Adds support for both still and animated webp images.
> Animated images won't be …optimized or get thumbnails.
> 
> Depends on https://github.com/discourse/discourse\_docker/pull/506
> and https://github.com/discourse/discourse\_docker/pull/507

上述提交增加了对 .webp 格式上传的支持。

在费了些周折让原始帖子重新渲染后，看来这个问题现在已经解决了（即“三星”标志已被下载并缓存在本地）。

我认为这个问题可以视为已解决。

---

<div class="post-metadata">

**Author:** ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)\
**Post date:** [2021年二月11日 21:44 UTC](https://meta.discourse.org/t/downloading-of-webp-images-in-oneboxes-is-broken/141602/14 "2021-02-11T21:44:17Z")

</div>


