Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php .rar、.zip文件MIME类型_Php_Zip_Mime Types_Rar - Fatal编程技术网

Php .rar、.zip文件MIME类型

Php .rar、.zip文件MIME类型,php,zip,mime-types,rar,Php,Zip,Mime Types,Rar,我正在开发一个简单的php上传脚本,用户只能上传ZIP和RAR文件 我应该使用什么MIME类型来检查$\u文件[x][type]?(请提供完整的清单) 谢谢。来自自由和平组织、基亚拉什和萨姆·弗罗贝格斯的回答: .rar application/x-rar-compressed, application/octet-stream .zip application/zip, application/octet-stream, application/x-zip-compressed,

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

我应该使用什么MIME类型来检查
$\u文件[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;
}
但即使WinRAR也会将非RAR文件检测为SFX存档:

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

由于扩展名可能包含多于或少于三个字符,因此无论扩展名的长度如何,下面将测试扩展名

试试这个:

$allowedExtensions = array( 'mkv', 'mp3', 'flac' );

$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));

if( in_array( $extension, $allowedExtensions ) ) { ///
要检查最后一个“.”之后的所有字符,请执行以下操作。

以进行上载: 有关mime类型的官方列表,请访问。根据他们的列表
Content-Type
zip
的标题是
application/zip

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

application/octet-stream
的意思相当于:“我向您发送了一个文件流,但没有指定该流的内容”(因此它也可以是
zip
rar
文件)。服务器应该检测流的实际内容

注意:对于上载,依赖
内容类型
标题中设置的mime类型是不安全的。标头在客户端上设置,可以设置为任何随机值。相反,您可以使用函数检测服务器上的文件mime类型


下载: 如果您只想下载一个
zip
文件,而不想下载其他内容,则只需设置一个
Accept
头值。如果服务器无法满足您在
Accept
头请求的mime类型中的要求,则设置的任何附加值都将用作备用值

根据该报告:

将被大胆地描述为:“我更喜欢
应用程序/zip
mime类型,但是如果您不能提供这种类型,那么
应用程序/octet流(文件流)也可以。”

因此,只有一个:

application/zip

将向您保证一个
zip
文件(或
406-如果服务器无法满足您的请求,则不可接受
响应)。

您不应信任
$\u文件['upfile']['mime']
,请自行检查mime类型。为此,您可以使用,从PHP5.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
在中,有一些Objective-C代码可以获取文件URL的mime类型。我基于Objective-C代码创建了一个Swift扩展,以获得mime类型:

import Foundation
import MobileCoreServices

extension URL {
    var mimeType: String? {
        guard self.pathExtension.count != 0 else {
            return nil
        }

        let pathExtension = self.pathExtension as CFString
        if let preferredIdentifier = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil) {
            guard let mimeType = UTTypeCopyPreferredTagWithClass(preferredIdentifier.takeRetainedValue(), kUTTagClassMIMEType) else {
                return nil
            }
            return mimeType.takeRetainedValue() as String
        }

        return nil
    }
}

我看到很多关于zip和rar的回答报告,媒体类型分别是
application/zip
application/x-rar-compressed

虽然前一个匹配是正确的,但对于后一个匹配,IANA在这里报告说,for rar
application/x-rar-compressed
是一个不推荐使用的别名,而
application/vnd.rar
是官方名称。 因此,2020年IANA的正确媒体类型为:

  • zip
    application/zip
  • rar
    application/vnd.rar

  • 我想允许所有压缩文件单独使用(rar、zip、tar.gz、jar等),这是什么过程?multipart/x-zip也是.zip的有效MIME类型(PKZIP存档)实际上还有另一种MIME类型用于zip,这就是:
    application/x-zip-compressed
    这根本不能保证您是
    zip
    rar
    文件。根据这篇文章,这将被大胆地描述为:“我更喜欢
    应用程序/zip
    |
    应用程序/x-rar-compressed
    内容类型,但如果您无法提供这一内容,那么
    应用程序/octet流
    (文件流)也可以。”这里是一个有用的mime类型列表,其中包括.zip:multipart/x-zip
    怎么可能有效?它不是多部分的。SitePoint列表包含许多不准确的MIME类型,而且还远远不够完整。这位官员还没有(也可能永远不会)100%完成。嗯,这一点不确定。他们关于zip的条目是1993年的…@Simpleton不确定。zip有应用程序/zip吗?我不确定我是否了解你的观点,但如果是这样,为什么一个被标记为官方的媒体类型会随着时间的推移而改变呢?没有有效期。也许文件可能会过时。你是对的,它们不会过期,除非它们被新的东西显式地过时。但IANA甚至没有提到其他zip mime类型。他们来自哪里?它们为什么存在?它们与官方的“应用程序/zip”有什么关系?也许IANA只是忘了更新他们的信息?我们怎么能确定?
    extension=php_fileinfo.dll
    
    import Foundation
    import MobileCoreServices
    
    extension URL {
        var mimeType: String? {
            guard self.pathExtension.count != 0 else {
                return nil
            }
    
            let pathExtension = self.pathExtension as CFString
            if let preferredIdentifier = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil) {
                guard let mimeType = UTTypeCopyPreferredTagWithClass(preferredIdentifier.takeRetainedValue(), kUTTagClassMIMEType) else {
                    return nil
                }
                return mimeType.takeRetainedValue() as String
            }
    
            return nil
        }
    }