Hoy he recibido una pregunta de un lector de este blog con un problema que lo traía por la calle de la amargura. Resulta que esta persona tenía colocados una serie de archivos en una carpeta de su servidor web y accesibles desde Internet, pero no era capaz de descargarlos. Los archivos en cuestión eran hojas de cálculo de Excel 2007, es decir, con la extensión .xlsx. Al intentar descargarlos y a pesar de que estaba seguro de que existían y estaba escribiendo bien la ruta de descarga, obtenía todo el tiempo un error estátus 404 de archivo no encontrado. Sin embargo un archivo con el mismo nombre pero con extensión .xls en formato de versiones anteriores de Excel sí que lo dejaba descargar. ¿Qué estaba pasando aquí?
La importancia de los tipos MIME
El hecho de que un archivo de cualquier tipo esté disponible en una carpeta accesible públicamente en un servidor web no quiere decir que éste pueda ser procesado y que se permita su descarga. Simplificando, el motivo es que HTTP, el protocolo usado en los servidores web, es un protocolo basado en texto y por lo tanto incapaz a priori de transmitir datos binarios. Por ello a la hora de transmitir archivos binarios como un ejecutable o una hoja de Excel 2007 (que no deja de ser un archivo .zip cambiado de nombre) se debe codificar de una forma especial basada en texto de forma que pueda ser transmitido usando HTTP. De hecho este método de envío de arhivos está heredado del correo electrónico y se denomina MIME (Multipurpose Internet Mail Extensions).
MIME define los mecanismos para poder enviar cualquier tipo de contenido textual o no a través de correo electrónico, y por extensión a través de HTTP. Ello incluye archivos binarios (imágenes, ejecutables...) y textos en codificaciones no ASCII. Una cabecera especial llamada Content-type define el tipo de archivo que se está envíando desde el servidor Web y que sirve en el otro extremo (el navegador o cliente Web) para determinar de qué forma se debe tratar dicho archivo. Por este motivo se suele hablar de tipos MIME o Tipos de Medio de Internet.
IANA (Internet Assigned Numbers Authority) mantiene una lista de tipos MIME estándar. Y además de éstos los propios fabricantes pueden definir sus propios tipos MIME para identificar tipos de contenidos y archivos específicos. Los tipos MIME se expresan en la forma tipo/subtipo. El subtipo empieza con "x-" si se trata de tipos no estándar, y con las letras "vnd" si son tipos específicos de una empresa (vendor).
Algunos ejemplos de tipos MIME son:
-
text/html: archivos HTML
-
text/plain: texto plano
-
audio/mpeg: archivos MP3
-
image/jpeg: imágenes JPEG
-
application/javascript: archivos de JavaScript
-
application/octet-stream: archivos binarios arbitrarios (sin especificar un formato concreto).
Configuración de tipos MIME en IIS
IIS no sirve ningún tipo de contenido que no tenga registrado previamente un tipo MIME asociado con su extensión. De hecho si entramos en la configuración de tipos MIME del servidor (simplemente yendo a las propiedades del servidor desde el administrador de IIS), ya nos manifiesta este hecho de manera clara al lado del botón de tipos MIME:
Entonces, el problema del lector del blog que me escribió estaba claro: no tenía los tipos MIME apropiados configurados.
IIS trae ya por defecto definidos multitud de tipos MIME y extensiones, entre las que se incluyen los archivos de Office (.doc, .ppt y .xls). Pero no trae los de Office 2007 por lo que si queremos servirlos tenemos que utilizar el botón resaltado en la figura anterior para añadirlos.
Nada más fácil: se especifica la extensión y el tipo MIME asociado a la misma. En el caso de los archivos de Office basta con copiar el tipo asociado a las extensiones de la versión anterior y especificarlos en las extensiones nuevas, es decir:
-
.xlsx: application/vnd.ms-excel
-
.pptx: application/vnd.ms-powerpoint
-
.docx: application/msword
Listo. Reiniciamos el servicio IIS (importante, si no no funcionará) y a partir de ese momento ya podemos servir archivos de Office 2007.
Lo mismo pasaría con cualquier otro tipo de archivos. Lo cual me recuerda un problema común que a muchos los pilla por sorpresa:
Servir aplicaciones Silverlight
Los archivos de Silverlight llevan la extensión .xap, la cual de entrada no está definida como un tipo MIME reconocido por IIS, así que muchos programadores que empiezan con Silverlight una vez que llevan la aplicación a su servidor de producción de repente ven que no les funcionan y no saben por qué es.
El problema se soluciona de la misma forma. El tipo MIME para .xap es application/x-silverlight-app.
Espero que estas explicaciones le sirvan a mucha otra gente ya que es un tema simple pero que muchos programadores Web desconocen.