TTF文件的MIME类型是什么?

52

我找不到TrueType字体的正确MIME类型。我需要它,因为我正在使用文件上传类(CodeIgniter)上传文件,并且我只想允许上传TTF文件。尝试过以下代码:

'ttf'   =>  'font/ttf'
'ttf'   =>  'font/truetype'

没有成功。

有任何想法吗?


相关:https://dev59.com/6XE85IYBdhLWcg3wPBB8 - Chris Moschini
8个回答

51

TTF字体文件的MIME类型为:font/ttf

2017年2月之前:

TTF没有分配MIME类型。您需要使用更通用的application/octet-stream,该类型用于指示没有分配MIME类型的二进制数据。


如何使用它来识别文件是否为TTF?谢谢。 - CappY
检查扩展名?如果需要代码,请告诉我。我认为你不能做比这更多的安全检查了。 - Aditya M P
1
Chrome很烦人地对它看到的每个.ttf文件都会抛出这个警告:资源被解释为字体,但传输的MIME类型为application/octet-stream。 - Chris Moschini
6
@ChrisMoschini 可以使用 application/x-font-ttf 解决这个问题。 - cprcrack
@cprcrack 在 IIS7.5 上进行了测试,你是正确的,将 .ttf 更改为作为 application/x-font-ttf 服务可以解决 Chrome 的问题。我看到 dkarp 的答案建议了这样做,但当我发表评论时,他的答案甚至还没有出现——很遗憾 StackOverflow 不能通知我特定问题上不断出现的答案,尤其是我已经评论过的问题。 - Chris Moschini

21

截至2017年2月,RFC 8081 添加了字体/*媒体类型,这些类型也列在IANA媒体类型列表中。font/ttf就在这个列表中。浏览器可能需要一些时间才能跟上。


21

我看到过 font/ttfapplication/x-font-ttf 用作 TTF 文件的 MIME 类型。但是,如果您上传的文件被识别为 application/octet-stream,而您不想简单地信任 .ttf 文件扩展名(或者如果您想处理没有扩展名的文件),那么您将不得不检查文件内容以确定它们是否为 TTF 文件。UNIX 的 magic 文件表示 TTF 文件会以 5 个字节开头

00 01 00 00 00

这是来自GDEF表版本的00 01 00 00和GlyphClassDef表偏移量前面的00

如果你的文件以这5个字节开头,那么它很可能是TTF文件。


4
@aditya:是的,这是一种启发式方法。如果OP确实想要确定,他可以编写完整的TTF验证解析器。但是检查前导十六进制00 01 00 00 00是从内容中检测TTF文件的标准方式。将这5个字节放入一个名为“foo”的文件中,然后在UNIX/Mac提示符下调用“file foo”命令,该命令将响应“foo:TrueType字体数据”。 - dkarp
我只是想表现得比实际聪明一些。谢谢你让我吃了一口谦虚的馅饼。 :D - Aditya M P

12

我知道这已经很老了,但似乎还没有人提供具体的解决方案示例。所以我们在这里为未来的人们提供:

我在使用Apache2和Chrome时遇到了同样的问题。 Chrome会警告说发送的带有mime类型为application / octet-stream的文件实际上是字体文件 - 这确实是字体文件。

对我来说,解决方法是在我的apache2配置文件中添加以下行:

AddType application/x-font-ttf .ttf

ps:

我曾尝试更新magic文件,但在完整重新加载apache2后无法正常工作。 我尝试的匹配模式(使用实际制表符分隔字段,并根据上面引用的魔术模式进行)如下:

  # True Type fonts
  0 string  \000\001\000\000\000  application/x-font-ttf
  0 string  \000\001\000\000\000  TrueType font data mime  application/x-font-ttf

谢谢!我正在使用这个MIME类型在我的IIS配置中解决Chrome的警告。 - Roy Tinker
很酷Roy。很高兴看到这对某人有所帮助 :) - Michael Mikowski

6

5

我没有使用过codeigniter,但我倾向于认为正确的MIME类型是:

application/x-font-ttf

我不确定这是否解决了你的问题。

无法工作。:( 在CI中,有一个包含类型数组的文件config/mimes.php。 - CappY
它是“正确的”,因为(类似于)当没有官方指定的MIME类型时,这就是您使用的内容。从MIME的角度来看,这是正确的方式,但是由于没有官方规范,您不能期望接收应用程序知道如何处理它。但是,如果您发现这是一个频繁的需求,请向IANA提出正式请求以注册此数据类型的适当MIME类型。请参见http://www.iana.org/assignments/media-types/index.html。 - tripleee

4

3

现在是时候进行一些调试工作了!如果某些内容无法正常工作,最好的选择就是打开代码,开始检查。

打开Uploads库(system/libraries/Upload.php)并查找大约位于200行左右的这段代码:

    // Set the uploaded data as class variables
    $this->file_temp = $_FILES[$field]['tmp_name'];
    $this->file_size = $_FILES[$field]['size'];
    $this->file_type = preg_replace("/^(.+?);.*$/", "\\1", $_FILES[$field]['type']);
    $this->file_type = strtolower(trim(stripslashes($this->file_type), '"'));
    $this->file_name = $this->_prep_filename($_FILES[$field]['name']);
    $this->file_ext  = $this->get_extension($this->file_name);
    $this->client_name = $this->file_name;

你会看到 $this->file_type 在那里被设置。使用 var_dump() 查看它包含的内容。
很可能你有一些 CodeIgniter 不知道的模糊 MIME 类型。将该 MIME 类型放入 config/mimes.php 中,它应该可以正常工作。
当你让它工作并接受这个答案后,请在评论中注明你使用的 MIME 类型,我将把它添加到 CodeIgniter Reactor 中,以确保没有人会卡住。

@Phil - 它是application/octet-stream,但对于.EXE也是一样的。有没有办法识别为TTF,或者我应该使用application/octet-stream并希望用户提交TTF? :) - CappY
1
有些浏览器会搞砸这些事情。它还会检查文件扩展名,当然这不是100%可靠的,但是如果他们将 .exe 上传为 .rtf,谁会在意呢?反正它无法正确执行。 - Phil Sturgeon
1
嗯...也许唯一的解决方案是上传文件,然后检查文件名.TTF,如果没有TTF就删除它。 - CappY
1
CodeIgniter会为您完成这项工作。只需将此MIME类型添加到您的mimes.php中,然后继续进行即可。 :) - Phil Sturgeon
我已经完成了,但问题是如果用户上传.EXE文件,CI将允许它。无论如何,我编写了代码,在上传后检查扩展名。如果不是TTF,则取消关联文件。感谢所有答案。 :) - CappY
我有一个类似的问题,与您的magic.mime文件有关。那个文件可能像这里一样过时了,但我不知道有没有简单的方法来更新或扩展该文件以包含新的文件类型,例如TTF。类似的线程在这里:http://stackoverflow.com/questions/6184220/safely-allow-upload-of-web-fonts-ttf-eot-svg-woff-otf-via-mime-types-fil - Jorre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接