Yo soy capaz de lograr esto con un .NET Genéricos Controlador (tengo este código de un proyecto de un cliente que ESRI consultoría abandonado, por lo que esta debe ser la manera en que lo hacen también).
Este es un ejemplo .NET, pero se podría hacer lo mismo con otros idiomas.
Aquí está el código para el controlador. El mío se llama csv.ashx.
<%@ WebHandler Language="C#" Class="csv" %>
using System;
using System.Web;
public class csv : IHttpHandler {
public void ProcessRequest (HttpContext context) {
String content = "no data";
String filename = "MyFile";
if (context.Request["report"] != null)
{
try
{
content = context.Request["report"].ToString();
}
catch
{
}
}
if (context.Request["filename"] != null)
{
try
{
filename = context.Request["filename"].ToString() + "_" + DateTime.Now.ToString("MMMd_HH.mm.ss");
}
catch
{
}
}
context.Response.ContentType = "text/csv";
context.Response.AddHeader("Content-disposition","attachment;filename="+filename+".csv");
context.Response.Write(content);
}
public bool IsReusable {
get {
return false;
}
}
}
Si el código se ejecuta en un directorio virtual de IIS, a continuación, incluir este archivo en el proyecto.
El siguiente es el código JavaScript. Suena como que ya estás almacenando los contenidos csv como una cadena. Yo uso una matriz llamada _csvreport para almacenar el contenido de la matriz.
Para agregar entradas, me gustaría hacer algo como:
_csvreport.push("column1,column2,column3");
Luego, para iniciar una nueva fila:
_csvreport.push("\r");
Que se traduce en el abandono a la línea siguiente en el archivo csv. Agregar más entradas y repetir como se desee.
Cuando el usuario hace clic en un botón para crear el archivo CSV, llamar a una función como esta:
function getCSV() {
//Get the stored CSV
var url = "webservices/csv.ashx";
var data = _csvreport.join("");
var f = dojo.byId("downloadform");
f.action = url;
dojo.byId("reportinput").value = data;
f.submit();
}
Esta función toma el _csvreport matriz y se hace una cadena. Luego se inyecta esa cadena en un formulario oculto en su .html de la página y envía el formulario.
El código para el formulario es el siguiente (y debe estar oculto a la vista):
<form method="post" action="" style="height: 0px; width: 0px; display: none;" class="dlform"
id="downloadform" target="_blank">
<input type="hidden" name="report" class="ri" id="reportinput" value="" />
<input type="hidden" name="filename" class="fn" id="filename" value="" />
<input type="hidden" name="s" class="s" id="s" value="" />
<input type="hidden" name="numberofcolumns" class="rit" id="numberofcolumns" value="pdf" />
</form>
Puse que justo en el interior del cuerpo de la página que contiene la funcionalidad de exportación de CSV.
Probablemente parece como un montón de trabajo, pero no es tan malo una vez que haya configurado.
El resultado final es que cuando el usuario hace clic en el botón exportar un archivo csv obtiene ofrecido para su descarga.
Observe que el formulario contiene un campo de entrada nombre de archivo, por lo que podría dinámicamente pasar nombres de archivo para el controlador a utilizar. En este caso, yo sólo codificado en el .archivo ashx.
El formulario contiene también algunos otros insumos que no lo estoy usando, pero que debe haber sido utilizado originalmente por ESRI. Creo que había un campo de formato (pdf vs csv) y una opción para establecer el número de columnas. Me acaba de salir aquellos en los que hay, pero que probablemente se podría quitar.
Espero que ayude.