Publicado en Internet

ASP: Mostrar ficheros que están fuera del sitio web

Veamos la situación en la que queremos mostrar un fichero, típicamente un PDF, un Excel o algún otro documento no HTML que queramos plasmar en la web, pero no queremos que el usuario conozca la URL del mismo para que sólo sea accesible desde la propia web, y no copiando la dirección en cualquier navegador. Una buena manera de conseguir ésto es sacando los ficheros fuera del sitio web, así ya no son accesibles vía URL. Pero el problema es: ¿y cómo muestro un fichero que está fuera del raíz de mi sitio web?

Pongámonos en situación. Si el sitio web está definido en el IIS en la ruta C:\webs\misitioweb, los ficheros que queremos ocultar vía URL los pondremos en C:\webs\docs. Obviamente, desde un ASP que esté dentro de misitioweb no vamos a poder acceder a docs, ya que está fuera del sitio web y el famoso Server.MapPath no admite «..» para subir de nivel fuera del mismo. Así que aquí viene la magia: el objeto «ADODB.Stream». Sé que hay gente que podría pensar en utilizar el objeto FSO, pero éste sólo lee datos ASCII así que para PDFs o Excels no nos va a servir. Vamos al código:

rutadoc = "C:\webs\docs\documento.pdf"
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1 ' Tipo binario, poniendo 0 sería tipo texto
objStream.LoadFromFile rutadoc
Response.ContentType = "application/pdf" ' El MimeType que corresponda
Response.BinaryWrite objStream.Read ' Aquí muestro el fichero
objStream.Close
Set objStream = Nothing

Creo que es bastante fácil de entender, simplemente creamos un objetivo de tipo Stream, lo abrimos, cargamos el objeto con el fichero en binario que queremos mostrar y lo mostramos. Funciona perfectamente bien y conseguimos el objetivo: mostrar un fichero en la web que está fuera en una ruta del sitio web, y por tanto, no es accesible mediante una URL escrita en el navegador directamente. Sólo una precaución, para que el Response.BinaryWrite funcione en Chrome y Firefox, es obligatorio poner el Response.ContentType correcto. Internet Explorer no lo necesita.

Espero que le sirva de ayuda a alguien y ante cualquier duda los comentarios están activados. Saludos.

Publicado en Internet, Microsoft, Tecnología

Instalar aspSmartUpload en Windows Server 2008

Se podría decir que aspSmartUpload es un componente obsoleto, deberías echarle un vistazo a XelUpload (sube ficheros con ASP sin instalar componente alguno), pero me consta que todavía hay gente que lo utiliza y me han pedido que explique como instalarlo ya que da bastantes problemas y la documentación es muy pobre, además contactar con los creadores es prácticamente imposible, así que allá va, es fácil, pero hay que seguir bien los pasos, si no, efectivamente, no funciona.

Doy por hecho que tienes las dos dll que dan vida al componente: aspSmartUpload.dll y aspSmartUploadUtil.dll.

Instalación

  1. aspSmartUpload.dll debe estar en una carpeta que no cuelgue de C:\Windows
  2. aspSmartUploadUtil.dll debe estar en la carpeta C:\Windows\SysWOW64
  3. Abre la línea de comandos en modo administrador
  4. Ve al directorio donde está aspSmartUpload.dll, por ejemplo: C:\Users\Administrador\aspsmartupload_3
  5. Ejecuta: regsvr32 aspSmartUpload.dll
  6. Te aparecerá una ventana por el trabajo bien hecho.

Errores conocidos

Si aparecen los mensajes «Module cannot be loaded» o «Specific module could not be found», es que no has hecho caso a los dos primeros puntos de este tutorial.

Si aparece el mensaje «The Call to DllRegisterServer Failed with Error Code 0×80004005» es que no has abierto la línea de comandos en modo administrador.

Creo que no se me olvida nada. Si siguiendo estos pasos a rajatabla no te funciona, probablemente tengas un error en el código (pégalo en los comentarios y lo debatimos) o la versión del aspSmartUpload no es la 3 (que es la última y la que yo he probado).