Menú
Está libre
registrarse
hogar  /  Consejos / Php cómo determinar el tipo de archivo por contenido. Extensión de archivo PHP

Php cómo determinar el tipo de archivo por contenido. Extensión de archivo con PHP

La última línea está cerca. Puede usar: if (mime_content_type ($ _ FILES ["fupload"] ["tmp_name"]) \u003d\u003d "image / gif") (...

En el caso cuando estoy trabajando ahora, mi $ _FILES .. ["type"] se dice a sí mismo como "text / csv", mientras que mime_content_type () y finfo () (sugerido por otros) informan "text / plain". Como señala @deceze, $ _FILES .. ["type"] solo es útil para saber qué tipo considera el archivo el cliente.

ADVERTENCIA : La siguiente respuesta no comprueba realmente el tipo de archivo. Solo verifica el nombre. es él no adecuado para fines de seguridad real.

EDITAR: no use este método, ya que no realiza un control de seguridad. Dejo esta respuesta aquí para que nadie cometa el mismo error que yo al intentar hacer esto.

Intenté lo siguiente y funcionó para mí:

$ allowed \u003d array ("gif", "png", "jpg", "pdf"); $ filename \u003d $ _FILES ["input_tag_name"] ["name"]; $ ext \u003d pathinfo ($ nombre de archivo, PATHINFO_EXTENSION); if (! in_array ($ ext, $ permitido)) (echo "error";)

En PHP 5.5, uso esta función para obtener el tipo de archivo y verificar si hay una imagen:

Función getFileType ($ file) (return image_type_to_mime_type (exif_imagetype ($ file));) // Obtener el tipo de archivo $ file_type \u003d getFileType ("ruta / a / images / test.png"); echo $ tipo_archivo; // Imprime image / png // 1. Todas las imágenes tienen un tipo mime que comienza con "image" // 2. Ningún otro tipo de mime que no contenga una imagen contiene una cadena "image"

Entonces podrías hacer:

If (strpos ($ filetype, "image")! \u003d\u003d false) (// Esta es una imagen)

Este es un script simple de una línea que uso a menudo.

$ image \u003d "/var/www/Core/temp/image.jpg"; $ isImage \u003d explotar ("/", mime_content_type ()) \u003d\u003d "imagen";

Básicamente, uso mime_content_type () para obtener algo como "image / jpg" y luego lo pirateo con "/" y verifico el primer elemento de la matriz para ver si dice "image".

¡Espero que esto funcione!

Por supuesto, puede verificar si esta es una imagen con exif, pero la mejor maneraPienso hacer esto con finfo de la siguiente manera:

$ allowed_types \u003d array ("aplicación / pdf", "image / jpeg", "image / png"); $ fileInfo \u003d finfo_open (FILEINFO_MIME_TYPE); $ detect_type \u003d finfo_file ($ fileInfo, $ _FILES ["datei"] ["tmp_name"]); if (! in_array ($ detect_type, $ allow_types)) (die ("Cargue un pdf o una imagen");) finfo_close ($ fileInfo);

Además de @deceze, también puede finfo () verificar el tipo de archivos MIME sin una imagen:

$ finfo \u003d nuevo finfo (); $ fileMimeType \u003d $ finfo-\u003e archivo ($ ruta. $ nombre de archivo, FILEINFO_MIME_TYPE);

Function asignarFilePreviews () ($ ("input"). Change (function () (var prvCnt \u003d $ (this) .attr ("data-preview-container"); if (prvCnt) (if (this.files && this. archivos) (var reader \u003d new FileReader (); reader.onload \u003d function (e) (var img \u003d $ (" "); img.attr (" src ", e.target.result); img.error (function () ($ (prvCnt) .html (" ");)); $ (prvCnt) .html (" ") ; img.appendTo (prvCnt);) reader.readAsDataURL (this.files);))));) $ (document) .ready (function () (asignarFilePreviews ();));

También maneja el caso cuando se selecciona un archivo con un tipo no válido (por ejemplo, pdf)

8 respuestas 8

Nunca use $ _FILES .. ["type"]. La información que contiene no se verifica en absoluto, este es un valor definido por el usuario. Comprueba el tipo tú mismo. Para las imágenes, exif_imagetype suele ser buena elección:

$ allowedTypes \u003d array (IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF); $ detectType \u003d exif_imagetype ($ _ ARCHIVOS ["fupload"] ["tmp_name"]); $ error \u003d! in_array ($ detectType, $ allowTypes); $ size \u003d getimagesize ($ nombre de archivo); if ($ size \u003d\u003d\u003d false) (lanzar una nueva excepción ("($ filename): imagen no válida.");) if ($ size\u003e 2500 || $ size\u003e 2500) (lanzar una nueva excepción ("($ filename) : Imagen demasiado grande. ");) If (! $ Img \u003d @imagecreatefromstring (file_get_contents ($ filename))) (arroja una nueva Excepción (" ($ filename): Contenido de imagen no válido. ");)

Una verificación en getimagesize () previene algunos ataques DoS porque no tenemos que intentar ejecutar imagecreatefromstring () desde cada archivo proporcionado por el usuario que no sea un archivo de imagen o un archivo de gran tamaño. Desafortunadamente, según los documentos, PHP no puede confiar en validar el contenido del tipo de imagen.

imagecreatefromstring () finalmente intenta abrir el archivo como una imagen, si tiene éxito, tenemos una imagen.

2017-07-12 09: 05: 07Z

Este es un script simple de una línea que uso a menudo.

$ image \u003d "/var/www/Core/temp/image.jpg"; $ isImage \u003d explotar ("/", mime_content_type ()) \u003d\u003d "imagen";

Usualmente uso mime_content_type () para obtener algo como "image / jpg", y luego exploto con "/" y verifico el primer elemento de la matriz para ver si dice "image".

¡Espero que esto funcione!

2017-10-18 22: 53: 49Z

En PHP 5.5, uso esta función para obtener el tipo de archivo y verificar si la imagen:

Función getFileType ($ file) (return image_type_to_mime_type (exif_imagetype ($ file));) // Obtener el tipo de archivo $ file_type \u003d getFileType ("ruta / a / images / test.png"); echo $ tipo_archivo; // Imprime image / png // 1. Todas las imágenes tienen un tipo mime que comienza con "image" // 2. Ningún otro tipo de mime que no contenga una imagen contiene una cadena "image"

Entonces puedes hacer:

If (strpos ($ filetype, "image")! \u003d\u003d false) (// Esta es una imagen)

Una lista completa de los tipos MIME: http: //www.sitepoint .com / web funds / MIME types-full-list /

2015-06-11 16: 47: 46Z

La última línea está cerca. Puede usar: if (mime_content_type ($ _ FILES ["fupload"] ["tmp_name"]) \u003d\u003d "image / gif") (... p\u003e

En el caso en el que estoy trabajando actualmente, mi $ _FILES .. ["type"] se informa a sí mismo como "text / csv", mientras que mime_content_type () y finfo () (sugerido por otros) informan "text / plain". " Como señala @deceze, $ _FILES .. ["type"] solo es útil para saber qué tipo considera el archivo el cliente.

2018-08-09 19: 38: 14Z

ADVERTENCIA: La siguiente respuesta no comprueba realmente el tipo de archivo. Solo revisa el nombre. es él no adecuado para fines de seguridad real.

EDITAR: no use este métodoporque no realiza un control de seguridad. Dejo esta respuesta aquí para que nadie cometa el mismo error que yo al intentar hacer esto.

Intenté lo siguiente y funcionó para mí.

La tarea de determinar la extensión surge en el desarrollo con bastante frecuencia, aquí, y el análisis de los archivos existentes y la búsqueda de archivos. Al trabajar con archivos en el servidor, también hay decisión frecuente guardando el archivo no con el nombre original, pero asignando el valor actual del servidor TIMESTAMP como el nombre del archivo. Hay muchas soluciones a este problema para varios lenguajes de programación. Aunque algunas soluciones, en primer lugar, vienen a la mente, a veces es necesario refinar debido a la variedad de nombres de archivos que pueden existir. Para un archivo llamado "myfile.txt", puede sugerir con seguridad dividir la línea en partes separadas por un punto y tomar el último. ¿Pero qué hacer con los archivos "my.file.txt" o si la extensión no está especificada "myfile"?

En este artículo, consideraremos tales soluciones.

Por conveniencia, especificaremos el nombre del archivo en una variable de cadena:


$ filename \u003d "myfile.txt";

// otras opciones para el nombre del archivo
$ filename \u003d "expediente"; // sin extensión especificada
$ filename \u003d "my.file.txt"; // punto en el nombre del archivo
$ filename \u003d "dir / myfile.txt"; // nombre de archivo con directorio
?>

La solución más simple y conveniente, en mi opinión, es usar la función pathinfo (), que devolverá una matriz asociada que contiene información sobre el nombre completo, la extensión y el directorio del archivo. Después de eso, solo queda dar salida al elemento necesario de la matriz.



$ file_info \u003d pathinfo ($ nombre de archivo);
return $ file_info ["extensión"];
}


?>

Para no realizar su propia función, puede simplificar el código especificando PATHINFO_EXTENSION como segundo parámetro. En este caso, la función no devolverá toda la matriz, sino solo el valor de extensión.


echo pathinfo ($ nombre de archivo, PATHINFO_EXTENSION);
?>

Ambas opciones devolverán correctamente el valor de extensión "txt", a menos que no se especifique la extensión. Donde no hay extensión, se devolverá una cadena vacía.

Esta solución está disponible para PHP a partir de la versión 4.0.3.


Si, debido a una versión de PHP o alguna otra razón, esta solución no está disponible, puede usar solución tradicional - desglose de la cadena del nombre del archivo en partes entre puntos, suponiendo que la última sección será una extensión.


función get_file_extension ($ filename) (
return end (explotar (".", $ nombre de archivo));
}

echo get_file_extension ($ nombre de archivo);
?>

Aquí, la función explotar () divide la cadena en una matriz de caracteres separados por puntos, y la función end () devuelve el último elemento de la matriz resultante.

En este ejemplo, si la extensión no se especifica explícitamente, es decir no hay punto en el nombre del archivo, se devolverá el nombre del archivo original. Si hay una extensión, se recibirá correctamente.

22

Tenga en cuenta que es posible que no necesite usar extensiones de archivo para determinar el tipo de archivo. por ejemplo, para descargar un archivo ejecutable con la extensión .png. Un cliente malintencionado puede falsificar fácilmente el mini-tipo para transferirlo como una imagen. Según esta información, esto es un riesgo de seguridad..

Para el tamaño del archivo, ya está utilizando $ _FILES ["archivo de imagen"] ["tamaño"]; Creo que esto es normal, pero solo lo sabrás si el archivo se ha descargado. Sin embargo no forma real mira esto antes de descargar, me temo ...

Puede encontrar el código JS para la primera verificación preliminar de la extensión antes de descargar el archivo, pero aún debe verificar el lado del servidor, ya que todo lo que se hace en el lado del cliente es inherentemente inseguro.

Sin embargo, no estoy seguro de si puede hacer lo mismo con respecto al tamaño del archivo ...

Algunos navegadores pueden admitir un campo oculto llamado MAX_FILE_SIZE (consulte la documentación de carga de archivos); pero no estoy seguro si esto es realmente compatible (nunca antes visto, en realidad, así que probablemente no :-()

Como nota, probablemente desee configurar upload_max_filesize para que le permita cargar al menos el tamaño que desee (de manera predeterminada, generalmente está configurado en 2 MB, por lo que debería estar bien)

2

Php es un lenguaje de secuencias de comandos del lado del servidor, y si las imágenes están en el lado del cliente, no puede verificar su tamaño antes de cargarlas a través de PHP .

2

Necesitas dos cosas:

su verificación de extensión no distingue entre mayúsculas y minúsculas:

If ($ strtolower ($ ext \u003d\u003d "jpg")) (// haz tus cosas)

Compruebe si el archivo realmente contiene una imagen. La forma más fácil de hacer esto es FileInfo:

$ finfo \u003d finfo_open (FILEINFO_MIME_TYPE); echo finfo_file ($ finfo, $ nombre de archivo); $ finfo_close ($ finfo);

Una forma alternativa de verificar si un archivo es realmente una imagen se carga en una biblioteca de imágenes como Gd. Si su archivo se puede descargar con éxito, esta es una imagen.

Manten eso en mente imágenes jpeg puede tener extensión .jpg o .jpeg.

3

Eso es lo que estoy haciendo:

If ($ _ FILES ["userPicture"] ["error"] \u003d\u003d 0) (// El archivo se cargó bien, por lo que está bien continuar con la verificación del tipo de archivo. $ Uploaded_type \u003d exif_imagetype ($ _ FILES ["userPicture"] ["tmp_name"]); // Lo que tenemos ahora es un número que representa nuestro tipo de archivo. switch ($ uploaded_type) (case "1": $ uploaded_type \u003d "gif"; break; case "2": $ uploaded_type \u003d " jpg "; break; case" 3 ": $ uploaded_type \u003d" png "; break;))

Editar: tiene la ventaja de funcionar "en cualquier navegador" porque no depende del nombre del archivo, o el usuario recibe algo más que un "error" en el valor de los archivos de la matriz, lo que nos dice que realmente no hubo ningún error.

¿Qué es un tipo de archivo MIME? ¿Cómo determinar el tipo MIME de un archivo usando PHP? Cómo instalar el módulo Fileinfo y configurar el servidor local, ensamblaje de Denver.

MIME: un estándar que describe la transmisión varios tipos datos sobre correo electrónicoasí como una especificación para codificar información y formatear mensajes para que puedan enviarse por Internet.

Enseñar material

Como tal, la definición del tipo MIME de un archivo se basa en su extensión (archivo). Como comprenderá, esta es una definición bastante condicional de un tipo MIME. Por ejemplo, el archivo image.jpg (incluso si fuera algo más), según la extensión jpg, se definirá un tipo MIME: image / jpeg. Por supuesto, puede analizar el contenido del archivo y determinar el tipo MIME correcto basado en él, pero esta solución está fuera del alcance de mi artículo.

Lo principal ahora para entender es la necesidad de un servidor magic.mime El archivo donde se describen los tipos MIME. Como tal, es parte de PHP. Sucede que en las carpetas del servidor Apache puede encontrar este archivo. En general, el que busca encontrará. En teoría, puede averiguar dónde está magic.mime leyendo el valor de la opción mime_magic.magicfile de php.ini. Por ejemplo:

Sin embargo, esta opción no me devuelve nada, sin embargo, pruébalo.

Cabe señalar que para determinar el tipo MIME de un archivo, PHP tiene el módulo Fileinfo. En otras palabras, siempre puede averiguar si tiene la oportunidad de descubrir algo o no, mediante la presencia de este módulo. Por ejemplo:

Entonces, si hay un módulo, existe la posibilidad de que todo funcione. En casos extremos, puede especificar la ruta a su archivo magic.mime.

Práctica

Más de una manera simple determinar el tipo MIME de un archivo usando PHP significa usar la función php mime_content_type () del módulo Fileinfo. Por ejemplo:

Como resultado, deberíamos obtener la línea: imagen / jpeg. Por supuesto, si el archivo image.jpg existe, el módulo Fileinfo está conectado y magic.mime está disponible.

Tenga en cuenta que el valor de la función mime_content_type () debe ser la ruta completa y el nombre del archivo, para lo cual utilicé la construcción dirname (__ FILE__). "image.jpg". También debe recordarse que esta función se considera obsoleta. obsoleto) continuará siendo excluido de PHP. Una alternativa es una solución escrita usando funciones php del mismo módulo Fileinfo:

Aquí, la función finfo_open () crea un recurso Fileinfo ($ finfo). Dada la constante FILEINFO_MIME_TYPE, disponible en versión PHP no inferior a 5.3.0, podemos obtener el tipo de archivo (s) MIME.

Creo que ya está claro que la función phfo finfo_file (), utilizando el recurso Fileinfo ($ finfo), nos devuelve información para archivo especificado ($ nombre de archivo). En nuestro caso, es un tipo MIME: image / jpeg.

Bueno, si todo lo anterior no funciona, puede escribir su propio analizador. También hay muchas opciones. Uno de ellos es el analizador de archivos magic.mime. No importa dónde esté, lo principal es que él es.

Creo que pintar eso sí, ya que no tiene sentido aquí, por lo que todo es más que comprensible. Solo quiero llamar su atención sobre la ruta que especifiqué al archivo mime.types. Como habrás adivinado, estamos hablando de servidor local. Más precisamente, sobre la asamblea Denver. Y aquí, procedemos sin problemas a instalar el módulo y configurar el servidor.

Instalación y configuración

Permítanme recordarles una vez más: estamos hablando de un servidor local, la asamblea de Denver. Como comprenderá, necesitaremos consultar el archivo php.ini. Lo tengo en la carpeta: C: \\ WebServer \\ usr \\ local \\ php5 \\. En él necesitamos conectar dos extensiones: php_fileinfo.dll y php_mime_magic.dll. Por ejemplo, así:

Extensión \u003d php_fileinfo.dll extensión \u003d php_mime_magic.dll

Llamo la atención sobre el hecho de que estas extensiones deben existir. Los tengo en la carpeta: C: \\ WebServer \\ usr \\ local \\ php5 \\ ext \\.

Mime_magic.debug \u003d En mime_magic.magicfile \u003d "C: \\ WebServer \\ usr \\ local \\ apache \\ conf \\ magic.mime"

Tenga en cuenta que para la opción mime_magic.magicfile, debe especificar la ruta completa y el nombre migic.mime. Eso es todo.