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

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

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

Спасибо..


person mrdaliri    schedule 08.08.2011    source источник
comment
Я хочу разрешить только все сжатые файлы (rar, zip, tar.gz, jar и т. д.), какова процедура?   -  person Ridhuvarshan    schedule 09.06.2017


Ответы (6)


Ответы Freedompeace, Kiyarash и Sam Vloeberghs:

.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
person Gfy    schedule 11.08.2011
comment
multipart/x-zip также является допустимым типом mimetype для .zip (архив PKZIP) - person Sam Vloeberghs; 04.03.2013
comment
на самом деле есть еще один MIME TYPE для zip, а именно: application/x-zip-compressed - person Kiyarash; 06.10.2014
comment
Это вовсе не гарантирует вам файл zip или rar. Согласно спецификациям WC3, это будет интерпретироваться как: Я предпочитаю тип контента application/zip|application/x-rar-compressed, но если вы не можете доставить его, подойдет и application/octet-stream (файловый поток). - person Wilt; 09.04.2015
comment
Вот полезный список типов mime с .zip среди прочего: sitepoint .com/web-foundations/mime-types-complete-list - person sstauross; 12.11.2015
comment
Как вообще multipart/x-zip может быть действительным? Он не многокомпонентный. Список SitePoint содержит много неточных типов MIME и далеко не полный. Официальный реестр IANA Media Types не является ( и, скорее всего, никогда не будет) завершен на 100%. - person Suncat2000; 04.06.2019
comment
Хотя сейчас это великолепное решение, не очень надежное. Кто знает, как заголовок может измениться или может быть добавлено другое новое содержимое заголовка в будущем. - person theking2; 19.07.2021

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

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

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

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

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


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

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

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

application/zip, application/octet-stream 

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

Так что только сингл:

application/zip

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

person Wilt    schedule 09.04.2015

Не стоит доверять $_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
person fibriZo raZiel    schedule 06.11.2015

Я вижу много отчетов об ответах для zip и rar для типов носителей application/zip и application/x-rar-compressed соответственно.

В то время как первое совпадение является правильным, для последнего IANA сообщает здесь https://www.iana.org/assignments/media-types/application/vnd.rar что для rar application/x-rar-compressed является устаревшим псевдонимом, а вместо него application/vnd.rar является официальным. Итак, правильные типы медиа от IANA в 2020 году:

  1. zip: application/zip
  2. rar: application/vnd.rar
person JeanValjean    schedule 07.09.2020
comment
Ну, не уверен в этом. Их запись о почтовом индексе от 1993... - person Simpleton; 10.09.2020
comment
@Simpleton не уверен, что в .zip есть application/zip? Не уверен, что понял вашу точку зрения, но если да, то почему тип носителя, который был помечен как официальный, должен меняться с течением времени? Нет срока годности. Возможно, файл может устареть. - person JeanValjean; 11.09.2020
comment
Вы правы, срок их действия не истекает, если они явно не устареют чем-то новым. Но IANA даже не упоминает эти другие типы почтовых мимов. Откуда они? Почему они существуют? Как они относятся к официальному приложению/zip? Возможно, IANA просто забыла обновить свою информацию? Как мы можем быть уверены? - person Simpleton; 17.09.2020

В связанном вопросе есть некоторый код 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
    }
}
person Wolfgang Schreurs    schedule 01.11.2018

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

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

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

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

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

для проверки всех символов после последнего '.'

person theking2    schedule 20.02.2015
comment
Это очень прискорбно, но нет гарантии, что соглашения о типах пантомимы, проиллюстрированные другими ответами, соблюдаются конкретными комбинациями ОС / браузера. К сожалению, единственное, в чем вы можете быть уверены, так это в расширении файла. - person theking2; 19.07.2021