.rar,.zip文件的MIME类型
我正在开发一个简单的php上传脚本,用户只能上传ZIP和RAR文件。
我应该用什么MIME类型来检查$_FILES[x][type]
? (请填写完整清单)
谢谢..
自由和平的答案是:
.rar application/x-rar-compressed, application/octet-stream
.zip application/zip, application/octet-stream
我也会对文件名进行检查。 这里是你如何检查文件是RAR还是ZIP文件。 我通过创建一个快速命令行应用程序来测试它。
<?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!x1Ax07x00
// http://en.wikipedia.org/wiki/RAR
if ($ext == '.rar' and bin2hex($bytes) == '526172211a0700') {
return TRUE;
}
// ZIP magic number: none, though PK 03 04, PK 05 06 (empty archive),
// or PK 07 08 (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)可以找到正式的MIME类型列表。 根据他们的名单Content-Type
报头zip
是application/zip
。
rar
文件的媒体类型未在IANA正式注册,但非官方常用的mime类型值为application/x-rar-compressed
。
application/octet-stream
意味着:“我给你发送一个文件流并且这个流的内容没有被指定”(所以它也可以是zip
或rar
文件)。 服务器应该检测流的实际内容是什么。
注意:对于上传,依靠Content-Type
标题中设置的MIME类型是不安全的。 标题在客户端设置,可以设置为任意值。 相反,您可以使用php文件信息功能来检测服务器上的文件MIME类型。
下载:
如果你想下载一个zip
文件而没有别的,你应该只设置一个Accept
头值。 如果服务器无法满足Accept
头中请求的MIME类型,则任何其他值集都将用作回退。
根据WC3规范:
application/zip, application/octet-stream
将被解释为:“我更喜欢application/zip
mime类型,但是如果你不能传递这个application/octet-stream
(文件流)也很好”。
所以只有一个:
application/zip
将保证您有一个zip
文件(或406 - Not Acceptable
响应,以防服务器无法满足您的请求)。
你不应该相信$_FILES['upfile']['mime']
,你自己检查MIME类型。 为此,您可以使用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
链接地址: http://www.djcxy.com/p/46783.html