169 votes

Fichiers .rar, .zip Type MIME

Je suis en train de développer un simple script de téléchargement php script, et les utilisateurs ne peuvent télécharger que des fichiers ZIP et RAR.

Quels types de MIME je dois utiliser pour vérifier $_FILES[x][type] ? (une liste complète s'il vous plaît)

0 votes

Je veux autoriser tous les fichiers compressés seuls (rar, zip, tar.gz, jar etc), quelle est la procédure à suivre ?

280voto

Gfy Points 2129

Les réponses de freedompeace, Kiyarash et Sam Vloeberghs :

.rar    application/x-rar-compressed, application/octet-stream
.zip    application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip

Je vérifierais également le nom du fichier. Voici comment vous pouvez vérifier si le fichier est un fichier RAR ou ZIP. Je l'ai testé en créant une application rapide en ligne de commande.

<?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;
}

Notez que ce n'est pas encore une certitude à 100%, mais c'est probablement suffisant.

$ rar.exe l somefile.zip
somefile.zip is not RAR archive

Mais même WinRAR détecte les fichiers non RAR comme des archives SFX :

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

2 votes

Multipart/x-zip est un mimetype valide pour les .zip également ( archive PKZIP )

14 votes

En fait, il y a un autre TYPE MIME pour le zip, et c'est : application/x-zip-compressed

0 votes

Cela ne vous garantira pas un zip o rar du tout. Selon le Spécifications WC3 cela sera interprété comme : "Je préfère un application/zip | application/x-rar-compressed type de contenu, mais si vous ne pouvez pas fournir cette application/octet-stream (flux de fichiers) est aussi très bien".

39voto

Wilt Points 867

Pour le téléchargement :

Une liste officielle des types de mime se trouve à l'adresse suivante L'IANA (Internet Assigned Numbers Authority) . D'après leur liste Content-Type en-tête pour zip es application/zip .

Le type de média pour rar n'est pas officiellement enregistré auprès de l'IANA, mais la valeur non officielle du type MIME couramment utilisée est la suivante application/x-rar-compressed .

application/octet-stream signifie autant que : "Je vous envoie un flux de fichiers et le contenu de ce flux n'est pas spécifié" (il est donc vrai que cela peut être un zip o rar également). Le serveur est censé détecter le contenu réel du flux.

Nota: Pour le téléchargement, il n'est pas sûr de s'appuyer sur le type mime défini dans l'option Content-Type en-tête. L'en-tête est défini sur le client et peut prendre n'importe quelle valeur aléatoire. Au lieu de cela, vous pouvez utiliser les informations sur le fichier php pour détecter le mime-type du fichier sur le serveur.


A télécharger :

Si vous voulez télécharger un zip et rien d'autre, vous ne devez définir qu'un seul fichier Accept valeur de l'en-tête. Toute valeur supplémentaire définie sera utilisée comme solution de repli au cas où le serveur ne pourrait pas satisfaire votre demande dans l'en-tête Accept l'en-tête mime-type demandé.

Selon le Spécifications WC3 ceci :

application/zip, application/octet-stream 

sera interprété comme : "Je préfère un application/zip mime-type, mais si vous ne pouvez pas fournir cette application/octet-stream (un flux de fichiers) convient également".

Donc seulement un seul :

application/zip

vous garantira un zip (ou un fichier 406 - Not Acceptable réponse au cas où le serveur ne serait pas en mesure de satisfaire votre demande).

6voto

fibriZo raZiel Points 385

Vous ne devez pas faire confiance $_FILES['upfile']['mime'] vérifiez le type MIME par vous-même. Pour cela, vous pouvez utiliser fileinfo extension activé par défaut à partir de 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.');

REMARQUE : N'oubliez pas d'activer l'extension dans votre site Web. php.ini et redémarrez votre serveur :

extension=php_fileinfo.dll

2voto

JeanValjean Points 3518

Je vois beaucoup de réponses concernant les types de médias zip et rar. application/zip y application/x-rar-compressed respectivement.

Alors que la première correspondance est correcte, pour la seconde, l'IANA signale ici https://www.iana.org/assignments/media-types/application/vnd.rar que pour rar application/x-rar-compressed est un nom d'alias déprécié et à la place application/vnd.rar est l'officiel. Ainsi, les bons Media Types de l'IANA en 2020 sont :

  1. zip : application/zip
  2. rar : application/vnd.rar

0voto

Wolfgang Schreurs Points 7910

Sur une question liée il y a un peu de code Objective-C pour obtenir le type mime d'une URL de fichier. J'ai créé une extension Swift basée sur ce code Objective-C pour obtenir le type 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
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X