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]
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:
-
private void Button_Click(object sender, RoutedEventArgs e)
-
{
-
HtmlDocument doc = HtmlPage.Document;
-
HtmlElement contenidoFichero = doc.GetElementById("contenidoFichero");
-
contenidoFichero.SetAttribute("value", txtContenido.Text);
-
-
HtmlElement nombreFichero = doc.GetElementById("nombreFichero");
-
nombreFichero.SetAttribute("value", txtNombreFichero.Text);
-
doc.Submit("formGenerarFichero");
-
}
Solo queda cambiar el tipo de respuesta que vamos a recibir desde el nuevo formulario.
-
public partial class GuardarFichero : System.Web.UI.Page
-
{
-
protected void Page_Load(object sender, EventArgs e)
-
{
-
string data = Request.Form["ContenidoFichero"];
-
string fileName = Request.Form["NombreFichero"];
-
Response.Clear();
-
Response.ContentType = "application/octet-stream";
-
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
-
Response.Write(data);
-
Response.Flush();
-
Response.Close();
-
}
-
}
abril 20th, 2009 at 19:25
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.
abril 21st, 2009 at 8:51
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
agosto 9th, 2009 at 8:18
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
agosto 12th, 2009 at 8:33
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
julio 13th, 2010 at 16:41
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
julio 14th, 2010 at 10:25
Puede que esto te pueda ayudar
http://pptx2silverlight.codeplex.com/
Saludos
Braulio