Mime 类型和文件扩展名之间有什么关系

Art*_*tro 7 php file mime-types

我的问题是:文件扩展名和它的 mime 类型之间是否存在某种关系?我的意思是,如果我得到一个文件,例如 .php 并将其扩展名更改为 .png 也会更改它的 mime 类型吗?

bis*_*hop 6

文件扩展名是有关文件包含的数据类型的提示。MIME 类型是文件中数据类型的标签。一种文件扩展名最多映射一种 MIME 类型。一种 MIME 类型映射到零个或多个文件扩展名。一个很好的例子是image/jpeg, 它映射到.jpg.jpeg

抛开理论不谈,浏览器为您提供的 MIME 类型通常是可靠的,但如果您需要确定性,则必须假设浏览器已受到损害。

在这种情况下,在使用 PHP 的服务器上,您可以检查给定文件是否与带有 FInfo 扩展名的给定 MIME 类型匹配:

$path = '/path/to/your/file.pdf';
$info = finfo_open(FILEINFO_MIME_TYPE);
switch (finfo_file($info, $fpath)) {
case 'application/pdf':
    // hooray, this is what you want
    // do whatever
    break;

default:
    throw new RuntimeException('I said give me a PDF!');
}
Run Code Online (Sandbox Code Playgroud)

或者如果你想要一个简单的功能:

function is_mime_type($path, $mime) {
    return (finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path) === $mime);
}

if (is_mime_type('/path/to/file.pdf', 'application/pdf')) {
    // hooray
}
Run Code Online (Sandbox Code Playgroud)

这是一个类似的答案,记录了实现此目标的其他方法。

这里有一个关于文件扩展名和 MIME 类型之间映射的答案。


Jos*_*lls 5

Short answer: Yes.

答案稍长:Mime 类型和文件扩展名提供了如何处理文件的提示。文件扩展名通常用于操作系统来决定使用什么程序打开文件,而浏览器则使用 Mime 类型来决定如何呈现某些数据(或服务器如何解释接收到的数据)。两者都是可选的,但达成协议是一个很好的做法。更改文件的 MIME 类型取决于您的网络服务器。我相信 Apache 有一些设置可以从扩展映射到 mime 类型。如果您有自己的后端服务内容,则可以使用任意 MIME 类型提供内容,例如,在 PHP 中:

<?php
// We'll be outputting a PDF
header('Content-Type: application/pdf');
...
Run Code Online (Sandbox Code Playgroud)

或者

<?php
header('Content-Type: application/javascript');
echo "//script code here"
Run Code Online (Sandbox Code Playgroud)