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