MIME 应用程序/下载

Posted

技术标签:

【中文标题】MIME 应用程序/下载【英文标题】:MIME application/download 【发布时间】:2011-07-08 03:47:11 【问题描述】:

我正在开发一个只允许上传 PDF 文件的 php 上传脚本。我在上传之前检查application/pdf MIME 类型。我有一个来自我的客户端的 PDF,我正在测试上传脚本,它没有通过上传错误检查并告诉我该文件是 application/download 的 MIME 类型。我确实通过 GMail 从客户端下载了 PDF。我还用我在 Photoshop 中创建的 PDF 进行了测试,脚本告诉我它也是 application/download 类型。

这是我的检查方式:

$mimeType = 'application/pdf';

if($_FILES[$filesName]['type'] != $mimeType)

  throw new UploadErrorException('File is not of correct type.');

我正在尝试在我的服务器上安装 Fileinfo 扩展(根据 grunk 的建议),但现在我正在寻找没有它的东西。

有什么想法吗?谢谢!

【问题讨论】:

检查 MIMEtype 的唯一可靠方法是 fileinfo php.net/manual/en/book.fileinfo.php 你如何检查这些信息?您的代码的一点摘录可能会有所帮助 @grunk - 我刚刚添加了代码的 sn-p。我目前没有在我的服务器上安装文件信息。我现在看看能不能安装。谢谢你 我想如何测试这个问题,如何准备应用程序/下载 mime 类型的 pdf 文件? 【参考方案1】:

您的上传脚本允许任何文件类型只要客户说它是 PDF。一些浏览器不能确定 MIME 类型(呃,因为确定 MIME 类型是一个难题)并且只发送一个通用的。检查“真实”MIME 类型的正确方法是使用fileinfo。

如果您没有 fileinfo,请使用以下插入式替换(仅限 PDF):

if (!class_exists('finfo')) 
  class finfo 
     function buffer($string) 
       switch (substr($string, 0, 4)) 
       case '%PDF': return 'application/pdf';
       default: return 'application/binary';
       
     
     function file($file_name, $options=0, $context=NULL) 
       $f = fopen($file_name, 'rb', false, $context);
       if ($f === false) return false;
       $magic = fread($f, 4);
       fclose($f);
       return $this->buffer($magic);
    
  

$finfo = new finfo();
echo $finfo->file('test.pdf');

【讨论】:

@letseatfood 我认为当时没有任何类似于今天的文件格式概念的东西。 file 早于互联网,可追溯到 1973 年。 哦,有趣...但我只是想知道如何在没有文件信息的情况下检查 mime-type(我的服务器没有它)。我应该用不同的措辞来表达我的评论。 @letseatfood 写了一个简短的技巧并将其添加到答案中。虽然只识别 PDF。 在 Linux/Unix/Posix 系统上,'file' 命令将返回对内容的(好的)猜测。大约在过去 10 年中,程序的版本也将返回 mime 类型,例如$mime_type=file -i sample.pdf 嗨 phihag。感谢您为我写出那个脚本。不幸的是,它对我没有任何回应。看来我真的只需要像你所说的那样安装 fileinfo 。我认为我的时间最好花在启动和运行文件信息上。感谢您的帮助!【参考方案2】:

如果您因任何原因无法使用 fileinfo,您可以打开上传的文件并检查其中的第一个字节。 因为你只想要 pdf 文件,所以这很容易。使用文本编辑器打开一个 pdf 文件,您可能会看到类似

的内容
%PDF-1.5

因此,如果上传的文件包含 %PDF ,具有 .pdf 扩展名和 application/pdf 作为 mime 类型,您就有很好的机会处理好类型。

但正如我已经说过的,如果你可以使用 fileinfo 这是一个更好的解决方案

【讨论】:

谢谢你。我将尝试启动并运行 fileinfo。

以上是关于MIME 应用程序/下载的主要内容,如果未能解决你的问题,请参考以下文章

MIME设置功能

下载流媒体不返回真实文件。错误的内容类型或 mime?

由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射

HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。

.apk文件下载出现如果应下载文件,请添加 MIME 映射。