.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 PK0304, PK0506 (empty archive), 
    // or PK0708 (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报头zipapplication/zip

rar文件的媒体类型未在IANA正式注册,但非官方常用的mime类型值为application/x-rar-compressed

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

注意:对于上传,依靠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

上一篇: .rar, .zip files MIME Type

下一篇: GridViewRowCommand keep fire