我有一个允许上传PDF文件和压缩文件(zip,rar,tar等等)的应用程序。我正在使用此MIME types列表作为参考来检查文件的类型。
以下是用于上传的PHP代码段:
//this function is called by AJAX
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$check= finfo_file($finfo,$file["tmp_name"]);
finfo_close($finfo);
if ($check != 'application/pdf' && $check != 'application/x-rar-compressed' && $check != 'application/x-rar'
&& $check != 'application/zip' && $check != 'application/x-compressed' && $check != 'application/x-zip-compressed' && $check != 'multipart/x-zip'
&& $check != 'application/octet-stream' && $check != 'application/gzip' && $check != 'application/tar'
&& $check != 'application/tar+gzip') {
echo json_encode(array('msg'=>'error. Try PDF or compressed file (zip, rar)'));exit();
}
if ($file['size'] > 10485760) { //10 MB
echo json_encode(array('msg'=>'error. Max size is 10MB'));exit();
}
$upload = new Upload($file);//Helper class to upload files
//the file is saved
当我进行测试时,我的本地环境和服务器中的所有工作正常,但我的客户端正在使用抛出“错误的PDF文件。尝试PDF或压缩文件(zip,rar)”。
我得到了他正在使用的相同文件(通过电子邮件),当我在本地计算机上测试时,一切正常。在调试中,$check
var的值为application/pdf
。
寻找我在SO中找到this question的任何解决方案,现在我在思考。我应该在第一个application/vnd.pdf
区块中加入application/x-pdf
,text/pdf
甚至if
吗?它可能会危及我的申请?
我正在使用Firefox,但也在Chrome和Opera中测试过。他在IE11中注意到了这个错误,但在Chrome中也是如此。他的计算机或浏览器是否可能正在更改MIME类型?
注意:有问题的文件的名称类似于“file.PDF”(PDF是Caps Lock),但我认为它不会导致问题。正如我所说,同样的文件在我的测试中有效。
更新
根据评论中@ fusion3k的建议,我打印了$check
var并显示错误消息。现在,当我尝试上传图片时,我得到:
尝试PDF或压缩文件(zip,rar)。图像/ JPEG
现在的问题是,有问题的文件(现在不止一个)在错误消息后打印一个空字符串,而且一旦MIME类型显然为空,我不知道该怎么做。
根据用户的说法,PDF是由旧的扫描仪生成的,我认为这可能是问题,但奇怪的是同一个文件(通过电子邮件发送给我)工作正常。