2011-07-07 15 views
9

Tengo un archivo llamado 94bf663a100e848fb599209af8cdc2b5.wmv. Sé que pathinfo no me dará la extensión si solo uso el nombre 94bf663a100e848fb599209af8cdc2b5. Creo que glob es solo para verificar si existe un archivo. Entonces, ¿es posible obtener una extensión de archivo simplemente conociendo el nombre del archivo (94bf663a100e848fb599209af8cdc2b5)?¿Es posible obtener una extensión de archivo sin saberlo?

+0

jajajaja eso es bueno. No puedo creer que hayas podido hacer esa referencia tan rápido. – Scarface

+0

Tenga en cuenta que cualquier extensión forma parte del nombre del archivo: puede tener archivos llamados 'foo',' foo.bar', 'foo.bar.tar',' foo.bar.tar.gz', 'foo.bar .tar.gz.sig', y todos se refieren a diferentes archivos. (Ignorar temporalmente los archivos con enlaces múltiples). Si no conoce ninguna extensión, en realidad no tiene el nombre del archivo. Esta distinción es importante, ya que es por qué [Michael] (http://stackoverflow.com/questions/6615039) y las respuestas de Switz (ahora eliminadas) no funcionan para usted. – sarnold

Respuesta

11

Como el ejemplo de la php glob manual page sugiere, glob hace no simplemente comprobar si el archivo existe, devuelve todos los archivos que coincide con la expresión.

Aquí es una modificación del ejemplo de that page para sus necesidades:

$name = "94bf663a100e848fb599209af8cdc2b5"; 
$matching = glob($name . ".*"); 

$info = pathinfo($matching[0]); 
$ext = $info['extension']; 

Esto supone que hay una (y sólo una) archivo con ese nombre (con cualquier extensión), pero usted debe ser capaz para modificarlo si el archivo puede no existir, o puede haber varios archivos con el mismo nombre y diferentes extensiones.

+0

Funciona rocker. Justo lo que estaba buscando más o menos. Cada nombre de archivo es único, así que creo que glob sería suficiente. – Scarface

1

La función finfo_file() inspeccionará la firma de bytes de un archivo para devolver su tipo MIME. A partir de ahí, puede deducir la extensión de archivo correcta.

// Adapted from the PHP docs 
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
echo finfo_file($finfo, $filename); 
finfo_close($finfo); 
+0

Esto supone que la extensión coincide con el tipo de mimo. Y falla para variantes como '.jpeg' vs' .jpg'. También requiere algún tipo de tabla de búsqueda con extensiones de archivo. –

+0

fileinfo no funciona sin la extensión. Acabo de probarlo. $ filename =/archivo1/archivo2/94bf663a100e848fb599209af8cdc2b5 – Scarface

+1

fileinfo funciona independientemente de la extensión que tenga un archivo o incluso si el archivo no tiene extensión. Esta es en realidad la forma preferida de encontrar/validar el tipo de archivo. Si bien no sé por qué está tratando de obtener la extensión, si es para validación, cualquier cosa que no use heurística para validar el tipo abrirá un agujero de seguridad en el sistema. – Mamsaac

0

Los primeros caracteres del archivo (binario) generalmente le darán algún tipo de pista sobre el tipo de archivo.

Pruébelo abriendo algunos archivos binarios (rar, zip, mp3, etc.) en el Bloc de notas.

+0

Sí, pero estoy tratando de obtener la extensión en php de una manera eficiente. – Scarface

0

Pruebe filetype() o mime_content_type() funcione en php ... pase la ruta del archivo devuelve el tipo de archivo.

Cuestiones relacionadas