.rar, .zip файлы MIME Тип

156

Я разрабатываю простой скрипт загрузки php, и пользователи могут загружать только файлы ZIP и RAR.

Какие типы MIME я должен использовать для проверки $_FILES[x][type]? (полный список, пожалуйста)

Спасибо..

mrdaliri
источник
Я хочу разрешить всем сжатым файлам (rar, zip, tar.gz, jar и т. Д.), Какова процедура?
Ридхуваршан

Ответы:

258

Ответы от Liberceace, Кияраша и Сэма Флёберга:

.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
GFY
источник
2
multipart / x-zip также является допустимым MIME-типом для .zip (архив PKZIP)
Сэм Влёбергс,
13
на самом деле есть еще один MIME TYPE для почтового индекса, и это:application/x-zip-compressed
Kiyarash
Это не гарантирует вам zipили rarфайл вообще. В соответствии со спецификациями WC3 это будет интерпретироваться как: «Я предпочитаю application/zip| application/x-rar-compressedтип контента, но если вы не можете доставить это, application/octet-stream(файловый поток) тоже подойдет».
Уилт
1
Вот полезный список типов пантомимы с .zip среди других: sitepoint.com/web-foundations/mime-types-complete-list
sstauross
1
Как в мире может multipart/x-zipбыть возможно? Это не из нескольких частей. Список SitePoint содержит много неточных типов MIME, и он далеко не полный. Официальный реестр IANA Media Types не заполнен (и, скорее всего, никогда не будет) заполнен на 100%.
Suncat2000
35

Для загрузки:

Официальный список типов пантомимы можно найти в Управлении по присвоению номеров в Интернете (IANA) . Согласно списку их Content-Typeзаголовку zipIS application/zip.

Тип носителя для rarфайлов официально не зарегистрирован в IANA, но неофициальное обычно используемое значение mime-type - application/x-rar-compressed.

application/octet-streamозначает столько, сколько: «Я отправляю вам поток файлов, а содержимое этого потока не указывается» (поэтому верно, что это может быть файл zipили rarфайл). Предполагается, что сервер обнаруживает фактическое содержимое потока.

Примечание: для загрузки небезопасно полагаться на тип пантомимы, установленный в Content-Typeзаголовке. Заголовок устанавливается на клиенте и может быть установлен на любое случайное значение. Вместо этого вы можете использовать функции информации о файле php, чтобы обнаружить mime-тип файла на сервере.


Для скачивания:

Если вы хотите загрузить zipфайл и ничего больше, вы должны установить только одно Acceptзначение заголовка. Любые дополнительные значения будут использоваться в качестве запасного варианта на тот случай, если сервер не сможет удовлетворить ваш Acceptзапрос в заголовке mime-type.

Согласно спецификации WC3 это:

application/zip, application/octet-stream 

будет интерпретироваться как: «Я предпочитаю application/zipmime-тип, но если вы не можете доставить это, то application/octet-stream(файловый поток) тоже подойдет».

Так что только один:

application/zip

Гарантирует вам zipфайл (или 406 - Not Acceptableответ, если сервер не сможет удовлетворить ваш запрос).

Уилт
источник
5

Вы не должны доверять $_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
фибризо разиэль
источник
0

В связанном вопросе есть некоторый код Objective C, чтобы получить тип mime для URL файла. Я создал расширение Swift на основе этого кода Objective C, чтобы получить тип 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
    }
}
Вольфганг Шреурс
источник
-2

Поскольку расширение может содержать более или менее трех символов, следующие будут проверять расширение независимо от его длины.

Попробуй это:

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

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

if( in_array( $extension, $allowedExtensions ) ) { ///

проверить все символы после последнего '.'

theking2
источник