2011-03-03 67 views
1

我正在研究PHP上传脚本,它允许上传PDF文件。上传前我正在检查application/pdf MIME类型。我有一个来自我的客户端的PDF,我正在测试上传脚本,并且未能通过上传错误检查并告诉我该文件是一种MIME类型application/download。我通过GMail从客户端下载了PDF。我还用我在Photoshop中创建的PDF测试了这一点,脚本告诉我它也是application/download类型。MIME应用程序/下载

这是怎么了检查:

$mimeType = 'application/pdf'; 

if($_FILES[$filesName]['type'] != $mimeType) 
{ 
    throw new UploadErrorException('File is not of correct type.'); 
} 

我试图让安装在我的服务器上Fileinfo的扩展名(每grunk的建议),但现在我在寻找的东西,没有它的工作。

任何想法?谢谢!

+0

的唯一可靠方法来检查MIME类型是FileInfo的http://www.php.net/manual/en/book.fileinfo.php你如何检查这些信息?你的代码的一小部分可能会有帮助 – grunk

+0

@grunk - 我刚刚添加了一段代码。我目前没有在我的服务器上安装fileinfo。我将会看看我现在是否可以安装它。谢谢你 –

+0

我想如何测试这个问题,我如何准备应用程序/下载MIME类型的PDF文件? – kicaj

回答

3

只要您的上传脚本允许任何文件类型,只要客户说它是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'); 
+0

感谢您的光临。我不知道人们在fileinfo之前使用了什么? –

+1

@letseatfood我不认为有什么类似今天的文件格式的概念。 '文件'早于互联网,可以追溯到1973年。 – phihag

+0

哦,有趣...但我只是想知道如何检查没有fileinfo的MIME类型(我的服务器没有它)。我应该以不同的方式评论我的评论。 –

1

如果您不能使用FileInfo的任何原因,你可以打开上传的文件,并首先检查字节。 由于您只需要pdf文件,所以非常简单。打开PDF文件使用文本编辑器,你可能可以看到类似

%PDF-1.5 

所以,如果上传的文件包含%PDF,有.pdf扩展和应用程序/ PDF作为MIME类型,你有很好的机会来处理与良好的类型。

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

+0

谢谢grunk。我将尝试获取并运行fileinfo。 –