Estoy haciendo un upload de archivos para mi página y las formas que figuran en los foros no me anduvo ninguna para validar tipos de archivos,. Solo quiero que acepte RAR o ZIP,
1 Respuesta
Respuesta de jjmh399
1
1
jjmh399, Experto en maquetación XHTML y programación con PHP
La mejor opción es comparar por el mime type, ya que por la extensión es más vulnerable, ten en cuenta que un usuario podría cambiarla en cualquier momento y subir el tipo de archivo que quisiera. Para hacerlo como tú comentas puedes hacerlo así: <?php $numero_caracteres = 3; //los correspondientes a la extensión if(strtolower(substr($_FILES['name'], (strlen($_FILES['name'] - $numero_caracteres)), $numero_caracteres)) == 'zip' || strtolower(substr($_FILES['name'], (strlen($_FILES['name'] - $numero_caracteres)), $numero_caracteres)) == 'rar') { //tu código } ?> Debes notar que primero tomamos los 3 últimos caracteres del nombre del archivo, correspondientes a la extensión, y después los ponemos en minúscula por si vienen en mayúsculas en el archivo. Para hacerlo por mime type tienes dos formas: Tomándolo del array $_FILES['type'] o utilizando la extensión file info. Con el array $_FILES es igual que para la extensión, solo que en lugar de tomar los 3 últimos caracteres del 'name', tomamos el type entero y lo comparamos con su correspondiente mime type (application/x-rar-compressed, application/zip, etc), ten en cuenta que puede haber varios según la configuración del servidor. Con finfo, sería también parecido, solo que en lugar de tomar el mime type del array $_FILES, lo tomaríamos de la siguiente manera: <?php $finfo = finfo_open(FILEINFO_MIME_TYPE); // devuelve el tipo mime de su extensión $mimetype = finfo_file($finfo, $_FILES['tmp_name']); // con éste es con el que debes comparar finfo_close($finfo); ?> Si no te queda muy claro, puedes poner tu código y lo repasamos, igual el fallo está en otro sitio.