为什么Zend Framework Validate在调用isValid()时MimeType失败

时间:2011-05-24 21:31:30

标签: php zend-framework zend-validate

过去几个小时,这让我很难过。

            // Using just straight up FINFO detects the mime type
            $oFileInfo = new finfo( FILEINFO_MIME_TYPE );
            $sMimeType = $oFileInfo -> file($_FILES['myfile']['tmp_name'] );
            // $sMimeType == 'application/pdf';

            // Using Zend File Transfer... detects the mime type
            $upload         = new Zend_File_Transfer_Adapter_Http();                
            $upload->addValidator('MimeType', true, array('application/pdf'));
            // $upload->getMimetype('myfile') == 'application/pdf'

            // But when I try to validate it throws an exception
            $upload->isValid('myfile');
            // Throws 
            // [fileMimeTypeFalse] => File 'myawesomefile.pdf' has a false mimetype of 'application/octet-stream'

代码在Apache,PHP 5.2(Zend Server)下运行良好,但现在它在Nginx,PHP-FPM,PHP 5.3下。我喜欢使用 isValid()方法来验证我上传的文件,但是mime类型不起作用。有什么建议?

2 个答案:

答案 0 :(得分:2)

上传的文件mimetypes永远不会太可靠......

我经常检查文件扩展名是一种悲伤的尝试,如果可能,请尝试实际检查文件的内容。

如果是图像,你可以运行getimagesize(),如果它是PDF,你可以创建一个验证器来调用Zend_Pdf :: load($ filename)并检查错误。可悲的是,即使是'Image'验证器也遇到了同样的问题。

答案 1 :(得分:1)

上传或验证文件时,文件扩展名可能不正确,因为当您使用。*作为扩展名时会出现application / octet-stream。

检查 finfo 类中的 文件 功能。

//$oFileInfo -> file($_FILES['myfile']['tmp_name'] );