2010-09-19 28 views
5

Estoy intentando detectar el tipo de archivo de una biblioteca de archivos en nuestro servidor web ya que estamos implementando código diseñado para transmitir archivos al navegador de forma segura. Anteriormente, los archivos se almacenaban y presentaban a los usuarios a través de un href directo.Detectando un tipo de archivo mimetype en coldfusion que ya está cargado en el servidor

He intentado hacer esto 3 maneras diferentes, todos en mi máquina local (que no es un entorno de producción simulada):

  1. Configuración de una variable a ser el valor de lo que se devuelve desde la función getPageContext(). getServletContext(). getMimeType(). Esto detecta algunos, pero no todos, tipos de mime para archivos.

  2. Creando un objeto de coldfusion.util.MimeTypeUtils y llamando a la función guessMimeType(). Esto también detecta algunos, pero no todos, tipos de mime para archivos.

  3. A cffile action = "leer" en los archivos de la biblioteca. Esta es la solución recomendada por mi jefe, ya que ha utilizado esto en archivos con cffile action = "upload" desde un formulario (y dice que funciona), pero cuando lo uso, la estructura cffile siempre está en blanco.

Idealmente, quiero recuperar el tipo mime de cada archivo ubicado en el servidor con 100% de precisión. El código que he escrito detectó aproximadamente el 99% de los archivos en mi copia del repositorio, dejando unos 30 que no puede identificar. Se incluyen en estos archivos de MS Office con la nueva extensión -x y archivos comprimidos tgz.

Me pregunto si existe una forma segura de detectar los tipos mime de cualquier archivo dado que existe en un servidor utilizando el código CF para verlo, y el código que se está utilizando funciona en un servidor de producción donde se instalan muy pocas aplicaciones? Entiendo que la primera función a la que hice referencia utiliza la biblioteca tipo mime del sistema operativo, y la segunda utiliza una lista predeterminada en el objeto java para mime-types. La búsqueda en Google y SO no ha producido nada que me diga que CF puede detectar con precisión los tipos de mime de archivo por sí mismo, ni he visto nada que diga que esto no se puede hacer.

Editar: Esto es en un entorno CF8.

+1

IIRC, el tipo de mimo en la carga cffile es el tipo de mimo reportado por el navegador del cliente, que puede o no ser preciso. Siempre existe, porque se requiere que el navegador envíe * algo * incluso si es esencialmente un marcador de posición. –

+0

@Ben, eso es lo que pensé también. La búsqueda en Google reveló resultados que son consistentes con esa explicación. Si puedo encontrar una respuesta aquí, puedo armar una función para verificar en el backend los tipos mimet de archivos cargados para que no tengamos que retroceder y borrar datos más tarde para tipos de mime inconsistentes o incorrectos desde archivos cargados desde usuarios. –

Respuesta

2

No habrá un 100% garantizado de manera segura porque los tipos de mimo son asignaciones arbitrarias.

Tendrá que utilizar las asignaciones de alguien, ya sea el SO o la JVM.

Será su responsabilidad completar cualquier espacio en blanco que tenga el SO o la JVM en las asignaciones, y mantenerlo actualizado.

Pero siempre podré crear algún archivo, darle una extensión de .xyzzy y no podrá encontrar el 'tipo de mime'.

+0

Esto solo parece la mitad de lo correcto. Sospecho que los mime-types no están almacenados en archivos, pero la asignación arbitraria tampoco parece ser correcta.Claro, puedes crear tu propia extensión de archivo aleatorio, pero si quisieras usarla programáticamente, tiene que haber una forma de asociar tu tipo de archivo con tu aplicación más allá de configurar la extensión y el tipo mime en tu sistema operativo tipo mime db /lista. –

+1

Quizás 'arbitrario' era la palabra incorrecta. Lo dije en serio en el sentido de no ser programático. No puede mirar un archivo que nunca ha visto antes y determinar el tipo de mime adecuado. El registro canónico de los tipos de mime está aquí: http://www.iana.org/assignments/media-types/. El método para determinar el tipo de mimo generalmente es buscando la extensión del archivo o el número mágico (http://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files) en una base de datos de tipos registrados. –

+0

Ok, ahora entiendo. Al ver cómo son los metadatos externos, veo cómo es imposible obtenerlos todo el tiempo. Puedo ocuparme de ingresar manualmente un pequeño grupo de mime-types y puedo implementar la validación para que solo acepte mime-types detectables actualmente o en el caso de los archivos desconocidos de MS Office, simplemente asigne programáticamente el tipo mimet correcto si el navegador no puede . Gracias por la ayuda. –

Cuestiones relacionadas