.rar,.archivos zip Tipo MIME
Estoy desarrollando un simple script de carga php, y los usuarios solo pueden cargar archivos ZIP y RAR.
¿Qué tipos MIME debo usar para comprobar $_FILES[x][type]
? (una lista completa por favor)
Gracias..
4 answers
Las respuestas de freedompeace, Kiyarash y Sam Vloeberghs:
.rar application/x-rar-compressed, application/octet-stream
.zip application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip
Yo también revisaría el nombre del archivo. Aquí es cómo se puede comprobar si el archivo es un archivo RAR o ZIP. Lo probé creando una aplicación de línea de comandos rápida.
<?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;
}
Observe que todavía no será 100% seguro, pero probablemente sea lo suficientemente bueno.
$ rar.exe l somefile.zip
somefile.zip is not RAR archive
Pero incluso WinRAR detecta archivos no RAR como archivos SFX:
$ rar.exe l somefile.srr
SFX Volume somefile.srr
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-29 17:55:45
Para subir:
Se puede encontrar una lista oficial de tipos mime en La Autoridad de Números Asignados de Internet (IANA) . De acuerdo con su lista Content-Type
el encabezado para zip
es application/zip
.
El tipo de medio para los archivos rar
no está registrado oficialmente en IANA, pero el valor no oficial de tipo mime comúnmente utilizado es application/x-rar-compressed
.
application/octet-stream
significa tanto como: "Te envío un flujo de archivos y el contenido de este flujo no se especifica" (por lo que es cierto que puede ser un zip
o rar
también). Se supone que el servidor detecta cuál es el contenido real de la transmisión.
Nota: Para cargar no es seguro confiar en el tipo mime establecido en el encabezado Content-Type
. El encabezado se establece en el cliente y se puede establecer en cualquier valor aleatorio. En su lugar, puede usar las funciones php file info para detectar el tipo de archivo mime en el servidor.
Para descargar:
Si desea descargar un archivo zip
y nada más, debe solo establezca un único valor de encabezado Accept
. Cualquier valor adicional será usado como reserva en caso de que el servidor no pueda satisfacer el tipo mime solicitado en el encabezado Accept
.
De acuerdo con las especificaciones WC3 esto:
application/zip, application/octet-stream
Se interpretará como: "Prefiero un tipo mime application/zip
, pero si no puede entregar esto, un application/octet-stream
(un flujo de archivos) también está bien".
Así que solo un solo:
application/zip
Le garantizará un archivo zip
(o un 406 - Not Acceptable
respuesta en caso de que el servidor no pueda satisfacer su solicitud).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-26 08:01:01
No debe confiar en $_FILES['upfile']['mime']
, verifique el tipo MIME usted mismo. Para tal fin, puede utilizar fileinfo
extensión , habilitada por defecto a 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.');
NOTA: No olvide habilitar la extensión en su php.ini
y reinicie su servidor:
extension=php_fileinfo.dll
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-06 13:31:23
Como extensión puede contener más o menos tres caracteres, lo siguiente probará una extensión independientemente de su longitud.
Prueba esto:
$allowedExtensions = array( 'mkv', 'mp3', 'flac' );
$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));
if( in_array( $extension, $allowedExtensions ) ) { ///
Para comprobar todos los caracteres después del último".'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-27 16:12:09