Guardar fichero desde Silverlight

Silverlight 6 Comentarios »

Pongámonos en situación. El problema es simple: Necesitamos generar un fichero con resultados / Informe y guardarlo en la maquina cliente. Por motivos de seguridad esto no podemos hacerlo desde Silverlight, ya que no podemos acceder al sistema de archivos en el cliente.

Isolated Storage

Bueno esto no es del todo cierto, ya que sí se puede generar un fichero en el cliente pero solo en un sandbox que tiene Silverlight dedicado a tal efecto. El problema de generar un fichero en el Isolated Storage es el path destinado a ello:

Path del Isolated Storage en Vista
%:\Users\%\AppData\LocalLow\Microsoft\Silverlight\is
Path del Isolated Storage en Windows XP
%:\Documents and Settings\%\Local Settings\Application Data\Microsoft\Silverlight\is

Es ese path habrá una carpeta para cada una de las aplicaciones Siverlight a las que hallamos accedido y hayan hecho uso de esta funcionalidad. 

Ventana 'Save File' en Silverlight

Esta ventana en Silverlight no existe, pero si podemos hacer que el usuario reciba un fichero y el decida donde guardalo. La solucion no es muy complicada. Vamos a añadir un nuevo formulario a la pagina sobre el cual  generaremos un submit . El destino de este nuevo formulario será una nueva página cuyo único cometido será devolvernos un fichero.

HTML:
  1. <form id="formGenerarFichero" action="GuardarFichero.aspx" method="post">
  2.           <input runat="server" type="hidden" id="contenidoFichero" />
  3.           <input runat="server" type="hidden" id="nombreFichero" />
  4. </form>

[/HTML]

Desde la aplicación Silverlight solo tenemos que jugar un poquito con el DOM de este nuevo formulario, identificando los elementos, estableciendo valores y por último provocando  un submit:

C#:
  1. private void Button_Click(object sender, RoutedEventArgs e)
  2. {
  3.     HtmlDocument doc = HtmlPage.Document;
  4.     HtmlElement contenidoFichero = doc.GetElementById("contenidoFichero");
  5.     contenidoFichero.SetAttribute("value", txtContenido.Text);
  6.  
  7.     HtmlElement nombreFichero = doc.GetElementById("nombreFichero");
  8.     nombreFichero.SetAttribute("value", txtNombreFichero.Text);
  9.     doc.Submit("formGenerarFichero");
  10. }

Solo queda cambiar el tipo de respuesta que vamos a recibir desde el nuevo formulario.

C#:
  1. public partial class GuardarFichero : System.Web.UI.Page
  2. {
  3.         protected void Page_Load(object sender, EventArgs e)
  4.         {
  5.             string data = Request.Form["ContenidoFichero"];
  6.             string fileName = Request.Form["NombreFichero"];
  7.             Response.Clear();
  8.             Response.ContentType = "application/octet-stream";
  9.             Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
  10.             Response.Write(data);
  11.             Response.Flush();
  12.             Response.Close();
  13.         }
  14. }

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Acceder

Switch to our mobile site