如果文件开头没有XML标签,为什么媒体库中的SVG上载失败?

时间:2019-06-14 作者:Theo d\'Or

我已使用以下代码启用SVG上载:

add_filter(\'upload_mimes\', function($mimes) {
  $mimes[\'svg\'] = \'image/svg+xml\';
  return $mimes;
});
但是,上载以<svg> 标记失败,通常显示“抱歉,出于安全原因,不允许使用此文件类型。”不支持SVG上载时WordPress显示的错误。

如果我添加<?xml version="1.0" encoding="UTF-8" standalone="no"?> 到文件,就在打开之前<svg> 标记,则上载成功。

为什么需要XML标记?这个要求在WordPress中是否正常,或者我的设置是否有问题?

2 个回复
最合适的回答,由SO网友:twelvell 整理而成

在WordPress的最新版本中,似乎对mime类型处理进行了更改,以确保文件具有他们所说的扩展名:https://make.wordpress.org/core/2018/12/13/backwards-compatibility-breaks-in-5-0-1/

这给没有标记的SVG文件带来了问题。

SVG实际上是一种XML,WordPress现在需要一行,如

<?xml version="1.0" encoding="utf-8"?>
在SVG文件中。

SO网友:Jacob Peattie

要验证上载,WordPress会将文件的MIME类型与该扩展名允许的MIME类型进行比较。因此,当文件上传时,WordPress会检查文件扩展名,.svg, 以及文件的MIME类型。然后根据.svg 扩大如果检测到的MIME类型不匹配,则拒绝上载。这样做的目的是防止危险文件以误导性的文件扩展名上载。

不过,文件MIME类型的实际检测最终由PHP处理。因此,如果SVG文件未被检测为image/svg+xml, 这是因为PHP无法将其识别为SVG文件。正如您所发现的,如果没有<?xml ?> 标记为SVG。它可能认为该文件是HTML文件,text/html. 这是因为HTML文档可以包含<svg> 元素,这意味着唯一可靠地区分带有SVG的HTML文件和实际SVG文件的方法是该标记的存在。

这就是为什么需要包含标签。这就是为什么image/svg+xml 文件