2009-01-08 32 views
8

Quiero obtener el tipo MIME de un nombre de archivo usando C. ¿Hay alguna manera de hacerlo sin usar un archivo de texto que contenga tipos MIME y extensiones de archivo (es decir, el archivo Apache mime.types)?Obtener el tipo MIME del nombre de archivo en C

Tal vez haya una función para obtener el tipo MIME utilizando el nombre de archivo? Prefiero no usar la extensión de archivo si no es necesario.

Respuesta

5

¡Si hubiera una manera de hacerlo, Apache no necesitaría su archivo mime.types!

La tabla tiene que estar en algún lugar. Está en un archivo separado que es analizado por su código, o está codificado en su software. El primero es más claro, la mejor solución ...

También es posible adivinar el tipo MIME de un archivo examinando el contenido del archivo, es decir, campos de encabezado, estructuras de datos, etc. Este es el enfoque utilizado por el file(1) programa y también por mod_mime_magic de Apache. En ambos casos, todavía usan un archivo de texto separado para almacenar las reglas de búsqueda en lugar de tener detalles codificados en el programa.

+0

Muy mal. ¿Pero no es capaz Apache de descubrir el tipo de mimet sin verificar la extensión de archivo? Conozco a algunos de mis amigos que escriben, por ejemplo, http: //domain.tld/picture y sus Apache devolviendo un JPG. ¿Eso es porque el tipo mimet está en el JPG? ¡Gracias por una respuesta rápida! – petsson

+3

el "archivo" de la utilidad Unix hace (muy) buenas conjeturas en tipos de archivos examinando encabezados, estructuras de datos, etc. ¡Pero usa un archivo separado (típicamente/usr/share/file/magic) para almacenar la heurística de búsqueda! La mod_mime_magic de Apache funciona de la misma manera. – Alnitak

+0

Bien, entonces lo sé. ¡Gracias de nuevo! – petsson

6

por lo que yo sé, el comando UNIX file emite la cadena de mímica con la opción -i:

> file -i main.c 
main.c: text/x-c charset=us-ascii 
+0

¿Cómo se podría usar eso con C? –

+0

simplemente llamándolo 'system (" file -i "pszFilename)' o buscando en el código de 'archivo', reconstruir las partes necesarias para analizar'/usr/share/file/magic' – lImbus

+0

Bien, lo intentaré esto tan pronto como pueda llegar a mi servidor UNIX nuevamente. :) – petsson

0

se puede descargar el código fuente del "archivo" herramienta desde aquí:

ftp://ftp.astron.com/pub/file/

lo que pasa es que doesn' Use una licencia GPL como licencia, o cualquiera para ese asunto.

0

Si desea utilizar un servicio web, que acabo de crear esto como parte de mi tipo MIME < -> icono de servicio

http://stdicon.com/

Por ejemplo:

http://stdicon.com/ext/html

Se ejecuta en appengine por lo que debe tener alta disponibilidad.

8

Acabo de implementar esto para un proyecto en el que estoy trabajando. libmagic es lo que estás buscando. En RHEL/CentOS es provisto por file-libs y file-devel. Debian/Ubuntu parece ser libmagic-dev.

http://darwinsys.com/file/

Aquí hay un código de ejemplo:

#include <stdio.h> 
#include <magic.h> 

int main(int argc, char **argv){ 
    const char *mime; 
    magic_t magic; 

    printf("Getting magic from %s\n", argv[1]); 

    magic = magic_open(MAGIC_MIME_TYPE); 
    magic_load(magic, NULL); 
    magic_compile(magic, NULL); 
    mime = magic_file(magic, argv[1]); 

    printf("%s\n", mime); 
    magic_close(magic); 

    return 0; 
} 

El código siguiente utiliza el valor por defecto de base de datos de magia/usr/share/misc/magic. Una vez que haya instalado los paquetes de desarrollo, la página man de libmagic es bastante útil. Sé que esta es una vieja pregunta, pero la encontré en mi búsqueda de la misma respuesta. Esta fue mi solución preferida.

Cuestiones relacionadas