.rar,.type MIME des fichiers zip
je suis en train de développer un script de téléchargement php simple, et les utilisateurs ne peuvent télécharger que des fichiers ZIP et RAR.
Quels types de MIME je devrais utiliser pour vérifier $_FILES[x][type]
? (une liste complète s'il vous plaît)
Merci..
4 réponses
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 aussi le nom du fichier. Voici comment vous pouvez vérifier si le fichier est un RAR ou un fichier ZIP. Je l'ai testé en créant rapidement une application 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"151910920"3"151910920"4, PK"151910920"5"151910920"6 (empty archive),
// or PK"151910920"7"151910920"8 (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;
}
remarquez qu'il ne sera toujours pas certain à 100%, mais il est probablement assez bon.
$ rar.exe l somefile.zip
somefile.zip is not RAR archive
mais même WinRAR détecte des fichiers non-RAR comme archives SFX:
$ rar.exe l somefile.srr
SFX Volume somefile.srr
Pour télécharger:
une liste officielle des types mime se trouve à the Internet Assigned Numbers Authority (IANA) . Selon leur liste Content-Type
en-tête pour zip
est application/zip
.
le type de média pour les fichiers rar
n'est pas officiellement enregistré à L'IANA, mais la valeur non officielle de type mime est application/x-rar-compressed
.
application/octet-stream
signifie autant que: "je vous envoie un flux de fichier et le contenu de ce flux n'est pas spécifié" (il est vrai qu'il peut être un zip
ou rar
fichier). Le serveur est censé détecter le contenu réel du flux.
Note: pour le téléchargement il n'est pas sûr de se fier au type mime défini dans l'en-tête Content-Type
. L'en-tête est réglé sur le client et peut être réglé à une valeur aléatoire. Au lieu de cela, vous pouvez utiliser le fichier php info fonctions permettant de détecter le fichier mime-type sur le serveur.
Pour le téléchargement:
si vous souhaitez télécharger un fichier zip
et rien d'autre, vous ne devez définir qu'une seule valeur d'en-tête Accept
. Tout jeu de valeurs supplémentaires sera utilisé comme repli au cas où le serveur ne pourrait pas satisfaire votre type mime dans l'en-tête Accept
demandé.
Selon le WC3 spécifications ce:
application/zip, application/octet-stream
sera intrepreted comme: "je préfère un application/zip
mime-type, mais si vous ne pouvez pas livrer ce application/octet-stream
(un flux de fichier) est également très bien".
Donc, un seul:
application/zip
vous garantit un fichier zip
(ou une réponse 406 - Not Acceptable
si le serveur n'est pas en mesure de satisfaire votre demande).
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 depuis 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.');
NOTE: n'oubliez pas d'activer l'extension dans votre php.ini
et de redémarrer votre serveur:
extension=php_fileinfo.dll
comme extension peut contenir plus ou moins que trois caractères, ce qui suit sera test pour une extension quelle que soit sa longueur.
essayez ceci:
$allowedExtensions = array( 'mkv', 'mp3', 'flac' );
$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));
if( in_array( $extension, $allowedExtensions ) ) { ///
pour vérifier tous les caractères après le dernier".