.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
标头为zip
是application/zip
。
rar
文件的媒体types没有在IANA正式注册,但非官方常用的MIMEtypes值是application/x-rar-compressed
。
application/octet-stream
意味着: “我发送给你一个文件stream,这个stream的内容没有指定” (所以它也可以是zip
或rar
文件)。 服务器应该检测到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 ) ) { ///
检查最后一个'。'后的所有字符。