.rar, .zip 文件 MIME 类型
我正在开发一个简单的php上传脚本,用户只能上传ZIP和RAR文件。
我应该使用哪些MIME类型来检查?(请提供完整列表)$_FILES[x][type]
我正在开发一个简单的php上传脚本,用户只能上传ZIP和RAR文件。
我应该使用哪些MIME类型来检查?(请提供完整列表)$_FILES[x][type]
自由和平组织、基亚拉什和山姆·弗洛伊伯格斯的回答:
.rar application/x-rar-compressed, application/octet-stream
.zip application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip
我也会检查文件名。以下是检查文件是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!\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)上找到。根据他们的列表标题是 。Content-Type
zip
application/zip
文件的介质类型尚未在 IANA 正式注册,但非官方常用的哑剧类型值为 。rar
application/x-rar-compressed
application/octet-stream
意思是:“我向您发送了一个文件流,但未指定此流的内容”(因此,它确实也可以是 or 文件)。服务器应该检测流的实际内容是什么。zip
rar
注意:对于上传,依赖标头中设置的 mime 类型是不安全的。标头在客户端上设置,可以设置为任何随机值。相反,您可以使用 php 文件信息函数来检测服务器上的文件 mime 类型。Content-Type
如果要下载文件而没有其他内容,则只应设置一个标头值。设置的任何其他值将用作回退,以防服务器无法满足您在标头中请求的 mime 类型。zip
Accept
Accept
根据WC3的规格,这个:
application/zip, application/octet-stream
将被描述为:“我更喜欢应用程序/zip
mime类型,但如果您无法提供此应用程序/八位字节流
(文件流)也很好”。
所以只有一个:
application/zip
将向您保证一个文件(或在服务器无法满足您的请求时的响应)。zip
406 - Not Acceptable