.rar,.zip文件的MIMEtypes

我正在开发一个简单的php上传脚本,用户只能上传ZIP和RAR文件。

我应该使用什么MIMEtypes来检查$_FILES[x][type] ? (请填写完整的表格)

谢谢..

自由和平的答案是:

 .rar application/x-rar-compressed, application/octet-stream .zip application/zip, application/octet-stream 

我也会对文件名进行检查。 这里是如何检查文件是否是RAR或ZIP文件。 我通过创build一个快速命令行应用程序来testing它。

 <?php if (isRarOrZip($argv[1])) { echo 'It is probably a RAR or ZIP file.'; } else { echo 'It is probably not a RAR or ZIP file.'; } function isRarOrZip($file) { // get the first 7 bytes $bytes = file_get_contents($file, FALSE, NULL, 0, 7); $ext = strtolower(substr($file, - 4)); // RAR magic number: Rar!\x1A\x07\x00 // http://en.wikipedia.org/wiki/RAR if ($ext == '.rar' and bin2hex($bytes) == '526172211a0700') { return TRUE; } // ZIP magic number: none, though PK\003\004, PK\005\006 (empty archive), // or PK\007\008 (spanned archive) are common. // http://en.wikipedia.org/wiki/ZIP_(file_format) if ($ext == '.zip' and substr($bytes, 0, 2) == 'PK') { return TRUE; } return FALSE; } 

请注意,它仍然不会100%确定,但可能足够好。

 $ rar.exe l somefile.zip somefile.zip is not RAR archive 

但是,即使WinRAR检测到非RAR文件作为SFX档案:

 $ rar.exe l somefile.srr SFX Volume somefile.srr 

对于上传:

互联网号码分配机构(IANA)可以find一个正式的MIMEtypes列表。 根据他们的列表Content-Type标头为zipapplication/zip

rar文件的媒体types没有在IANA正式注册,但非官方常用的MIMEtypes值是application/x-rar-compressed

application/octet-stream意味着: “我发送给你一个文件stream,这个stream的内容没有指定” (所以它也可以是ziprar文件)。 服务器应该检测到stream的实际内容是什么。

注意:对于上传,依靠Content-Type标题中设置的MIMEtypes是不安全的。 头部设置在客户端上,可以设置为任意值。 相反,您可以使用php文件信息function来检测服务器上的文件MIMEtypes。


下载:

如果你想下载一个zip文件而没有别的,你应该只设置一个单一的Accept头值。 如果服务器无法满足Accept头中所请求的MIMEtypes,则将使用任何附加值集作为回退。

根据WC3的规格说明 :

 application/zip, application/octet-stream 

将被解释为: “我更喜欢一个application/zip mimetypes,但是如果你不能传递这个application/octet-stream (一个文件stream)也是好的”。

所以只有一个:

 application/zip 

将保证您的zip文件(或406 - Not Acceptable响应,如果服务器无法满足您的要求)。

你不应该相信$_FILES['upfile']['mime'] ,请自己检查MIMEtypes。 为此,您可以使用fileinfo扩展 ,从PHP 5.3.0开始默认启用。

  $fileInfo = new finfo(FILEINFO_MIME_TYPE); $fileMime = $fileInfo->file($_FILES['upfile']['tmp_name']); $validMimes = array( 'zip' => 'application/zip', 'rar' => 'application/x-rar', ); $fileExt = array_search($fileMime, $validMimes, true); if($fileExt != 'zip' && $fileExt != 'rar') throw new RuntimeException('Invalid file format.'); 

注意:不要忘记在php.ini启用扩展,然后重新启动服务器:

 extension=php_fileinfo.dll 

由于扩展可能包含或多或less的三个字符,以下将testing扩展名,无论其长度。

尝试这个:

 $allowedExtensions = array( 'mkv', 'mp3', 'flac' ); $temp = explode(".", $_FILES[$file]["name"]); $extension = strtolower(end($temp)); if( in_array( $extension, $allowedExtensions ) ) { /// 

检查最后一个'。'后的所有字符。