2011-02-24 14 views
5

Estamos utilizando FusionCharts y tiene la capacidad de uso de JavaScript del lado del cliente para exportar datos CSV, que quieren ser capaces de tomar esos datos y crear un archivo sobre la marcha en el navegador. ¿es eso posible? ¿Cómo?cliente de creación de archivos lado y descarga

+0

¿quieres crear un archivo usando JavaScript en el cliente? – SuperSaiyan

+0

AFAIK no hay manera con solo js. –

+0

Parece que nadie aquí ha proporcionado una solución de navegador cruzada * de lado del cliente * automática así que aquí está: http://stackoverflow.com/a/3665147/279255 – Marc

Respuesta

-2

que no hay manera de tocar el disco local con Javascript por diseño.

Creo que podría pasar todo el conjunto de datos de javascript al código del lado del servidor (php, asp.net, java ...) entonces podría transmitirlo al navegador de alguna manera.

+2

http://www.html5rocks.com/en/tutorials/file/filesystem/... – AKX

+1

La especificación API del sistema de archivos ^^ ha sido eliminada a partir del 4/2014. –

2

Try a continuación código le permiten acceder a sistema de archivos del lado del cliente, pero esto sólo funciona en el navegador Internet Explorer

<html> 
    <body> 
    <script language="JScript"> 
    <!-- 
    function getsize() 
    { 
     var myObject, afile, size; 
     myObject = new ActiveXObject("Scripting.FileSystemObject"); 
     afile = myObject.GetFile("c:\\test.txt") 
     size = afile.Size; 
     alert("The size of the test.txt file is:" + size); 
    } 
    --> 
    </script> 
    Get the size for the file "test.txt" 
    <form name="myForm"> 
    <input type="Button" value="Get Size" onClick='getsize()'> 
    </form> 
    </body> 
    </html> 
+3

buena solución por el bien del ejemplo, pero creo que nunca deberíamos implementar nada en un navegador de manera específica, estamos en 2011 no en 1998 y la gente usa Chrome, Opera, Safari, IE, Firefox, navegadores móviles ... –

+1

@Davide - Solo le muestro la manera de aumentar su conocimiento de que podemos hacerlo en un navegador, y mi respuesta de alguna manera cumple con su requisito medio. Mi respuesta no está fuera del alcance de esta pregunta ... lo que usted escribió Ya sé ... y ya escribí en mi respuesta que este es el formulario de trabajo, es decir, solo –

+1

Veo su punto, pero quería señalar que no deberíamos tener como objetivo ningún navegador o sistema operativo específico, el código anterior probablemente fallaría en ipad o cualquier otro plataforma no windows. –

1

Yo sugeriría que no permite crear un archivo de forma local en el lado del cliente, en lugar de preguntar al usuario (diálogo Guardar como recuadro) para descargar los datos del lado del cliente generado en la ubicación que desea.

La solución para descargar contenidos locales/del lado del cliente a través de JavaScript no es sencillo. Implementé una solución usando smartclient-html-jsp.

Aquí está la solución:

  1. estoy en el proyecto de construcción de SmartClient. Necesitamos descargar/exportar datos de una cuadrícula (tabla como estructura).
  2. Estábamos utilizando servicios web RESTish para servir los datos del lado del servidor. Así que no pude golpear la url dos veces; uno para la red y la segunda vez para exportar/transformar los datos para descargar.
  3. Lo que sí está hecho de dos páginas JSP a saber: blank.jsp y export.jsp.
  4. blank.jsp es, literalmente, espacio en blanco, ahora tengo que exportar los datos de la cuadrícula que tenga ya en el lado del cliente.
  5. Ahora, cuando el usuario pide nunca para exportar los datos de la cuadrícula, lo hago a continuación:
    1. abierto una nueva ventana con blank.jsp url
    2. utilizando document.write creo una forma en la que con el nombre de un campo de texto de y establecer datos para exportar dentro de él.
    3. Ahora POST que forma export.jsp de la misma jerarquía.
    4. El contenido de export.jsp que estoy pegando a continuación se explica por sí mismo.
<%@ page import="java.util.*,java.io.*,java.util.Enumeration"%> 
<% 
    response.setContentType ("text/csv"); 
    //set the header and also the Name by which user will be prompted to save 
    response.setHeader ("Content-Disposition", "attachment;filename=\"data.csv\""); 
    String contents = request.getParameter ("text"); 
    if (!(contents!= null && contents!="")) 
     contents = "No data"; 
    else 
     contents = contents.replaceAll ("NEW_LINE", "\n"); 

    //Open an input stream to the file and post the file contents thru the 
    //servlet output stream to the client m/c 

    InputStream in = new ByteArrayInputStream(contents.getBytes()); 
    ServletOutputStream outs = response.getOutputStream(); 

    int bit = 256; 
    int i = 0; 
    try { 
     while ((bit) >= 0) { 
      bit = in.read(); 
      outs.write(bit); 
     } 
     //System.out.println("" +bit); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(System.out); 
    } 
    outs.flush(); 
    outs.close(); 
    in.close(); 
%> 
<HTML> 
<HEAD> 

</HEAD> 

<BODY> 

<script type="text/javascript"> 
    try {window.close();} catch (e) {alert (e);} 
</script> 
</BODY> 
</HTML> 

Este código es probado y desplegado/trabajar en el entorno de producción, también esto es funcionalidad cross-browser.

+0

Esto es completamente en el servidor y no tiene nada que ver con la pregunta –

2

Tome un vistazo a filesaver.js. Siempre que esté de acuerdo con IE10 +, esta es una solución bastante sólida que se maneja con elegancia utilizando el mejor método según el navegador.

2

Dado que la respuesta de Marc era (estúpidamente) se convierta en un comentario, y ninguna de las otras respuestas en realidad responde a la pregunta, aquí está la respuesta:

<a id="a">Click me to DL something</a> 
<script> 

setupDownloadLink(document.getElementById("a"), "moose.txt", "ok") 

function setupDownloadLink(element, filename, text) { 
    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)) 
    element.setAttribute('download', filename) 
} 
</script> 

Esto se deriva de la respuesta Marc referencia, que es útil en situaciones en las que no está haciendo clic en concreto en una etiqueta de enlace: https://stackoverflow.com/a/3665147/279255

// must be called in a click handler or some other user action 
function download(filename, text) { 
    var element = document.createElement('a'); 
    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); 
    element.setAttribute('download', filename); 

    element.style.display = 'none'; 
    document.body.appendChild(element); 

    element.click(); 

    document.body.removeChild(element); 
} 
+0

5 años después ¿no? LOL – arinte

+0

@arinte heh, no va a ser para su beneficio en este punto –

Cuestiones relacionadas