Guardar fichero desde Silverlight

Silverlight Add comments

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. }

6 Responses to “Guardar fichero desde Silverlight”

  1. Amaya Says:

    Hola. Yo tengo una carpeta llamada IsolatedStorage en Datos de programa de Documents And Settings. No sé de donde ha salido. ¿Puedo borrarla? ¿Para que sirve?. Gracias. Un saludo.

  2. admin Says:

    Hola Amaya,

    La carpeta de IsolatedStorage te la crea automaticamente Silverlight, si alguna de las aplicaciones que usas hace uso de ella. Puedes desactivar el IsolateStare Area, desde el menu contextual de Silverlight.

    El borrarla o no depende de ti, y si alguna aplicacion ha echo uso de ella para guardar datos (simplemente los perderias).

    Espero que esto resuelva tu duda.

    Saludos,
    Jose

  3. Alfredo Valencia Says:

    Hola.

    Tu ejemplo me ha servido de gran ayuda, pero tengo un problema en mi aplicación los usuarios manejan distintos tipos de archivo (xls,ppt,doc,jpg, etc…), lo que hago acutalmente es lo siguiente.

    1.- el usuario selecciona un archivo con open file dialog, internamente obtengo los bytes y lo guardo en una base de datos.

    2.- al hacer un usuario la consulta carga un grid con los archivos y al darle click al archivo internamente obtengo los bytes de la base de datos y los guardo en isolated storage. “hasta aqui todo va bien”…

    De ahi como puedo hacer para que al usuario le aparezca la ventana de save file como muestras en tu ejemplo ?

    intente obtener el path del isolated storage pero me ha sido imposible..

    Que me sugieres….

    Espero puedas ayudarme

    Gracias

  4. Braulio Says:

    Buenas noticias,

    En SL 3.0 han implementado un Save dialog que guarda los ficheros al local de tu ordeandor (ya existia un dialog de load).

    Alfredo, para tu caso te recomiendo que uses esto, algunos links:

    http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2009/03/18/a-quick-look-at-silverlight-3-save-file-dialog.aspx

    http://www.silverlightshow.net/items/Using-the-SaveFileDialog-in-Silverlight-3.aspx

    Yo tengo hecho un ejemplo que guarda un canvas a JPG a local, si te vale te paso el link.

    Saludos
    Braulio

  5. Ninoska Says:

    Hola gracias por el aporte, mi pregunta es la siguiente yo quiero mostrar una presentacion de power point del sistema que estoy haciendo en mi pagina principal utilizo silverligth, me podrias orientar al respecto??

    Gracias

  6. Braulio Says:

    Puede que esto te pueda ayudar

    http://pptx2silverlight.codeplex.com/

    Saludos
    Braulio

Leave a Reply

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

Switch to our mobile site