Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 客户端文件创建和下载_Javascript_Html - Fatal编程技术网

Javascript 客户端文件创建和下载

Javascript 客户端文件创建和下载,javascript,html,Javascript,Html,我们正在使用fusioncharts,它能够在客户端使用javascript导出csv数据,我们希望能够获取该数据并在浏览器中动态创建文件。可能吗?如何操作?您无法通过设计使用Javascript来接触本地磁盘 我认为您可以将全部数据从javascript传递到服务器端代码(php、asp.net、java…),然后以某种方式将其流式传输到浏览器。尝试下面的代码允许您访问客户端文件系统,但这只适用于IE浏览器 <html> <body> <scrip

我们正在使用fusioncharts,它能够在客户端使用javascript导出csv数据,我们希望能够获取该数据并在浏览器中动态创建文件。可能吗?如何操作?

您无法通过设计使用Javascript来接触本地磁盘


我认为您可以将全部数据从javascript传递到服务器端代码(php、asp.net、java…),然后以某种方式将其流式传输到浏览器。

尝试下面的代码允许您访问客户端文件系统,但这只适用于IE浏览器

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

获取文件“test.txt”的大小

我建议您不要在客户端本地创建文件,而是提示用户(另存为对话框)在他想要的位置下载客户端生成的数据

通过javascript下载本地/客户端内容的解决方案并不简单。我已经使用smartclient html jsp实现了一个解决方案

以下是解决方案:

  • 我参与了一个基于SmartClient的项目。我们需要下载/导出网格的数据 (桌状结构)
  • 我们使用restishweb服务从服务器端提供数据。所以我不能两次点击网址;一次用于网格,第二次用于导出/转换要下载的数据
  • 我做了两个jsp,即blank.jsp和export.jsp
  • jsp实际上是空白的,现在我需要导出网格数据 我在客户端已经有了
  • 现在,当用户要求导出网格数据时,我会执行以下操作:
  • 使用url blank.jsp打开一个新窗口
  • 使用document.write,我在其中创建了一个表单,其中包含一个字段名文本,并在其中设置要导出的数据
  • 现在将该表单发布到具有相同继承权的export.jsp
  • 下面我粘贴的export.jsp的内容是不言自明的
  • 
    = 0) {
    位=in.read();
    输出。写入(位);
    }
    //System.out.println(“+”位);
    }捕获(ioe异常ioe){
    ioe.printStackTrace(系统输出);
    }
    out.flush();
    out.close();
    in.close();
    %>
    尝试{window.close();}catch(e){alert(e);}
    
    此代码已在生产环境中测试和部署/工作,这也是跨浏览器功能。

    请查看。只要你对IE10+还满意,这是一个非常可靠的解决方案,根据浏览器的不同使用最佳方法进行优雅的处理。

    因为Marc的答案(愚蠢地)转换成了评论,而其他答案都没有真正回答这个问题,下面是答案:

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

    您想使用客户端Javascript创建文件吗?AFAIK只有js是不行的。这里似乎没有人提供自动客户端跨浏览器解决方案,所以这里是:@arinte我以前回答过这个问题,这里可能是nice解决方案的副本,为了示例,但我认为我们永远不应该以特定于浏览器的方式实现任何东西,我们是在2011年,而不是1998年,人们使用Chrome、Opera、Safari、IE、Firefox、移动浏览器……@Davide-我只是展示了一种方法来增加他的知识,我们可以在IE浏览器中实现,我的回答是如何满足他的一半要求。。我的回答不在这个问题的范围之外。。。你写的我已经知道了。。。我已经在回答中写道,这是工作表,我明白你的意思,但我想指出,我们不应该针对任何特定的浏览器或操作系统,上面的代码可能会在ipad或任何其他非windows平台上失败。文件系统API规范^^^已于2014年4月被删除。这完全是服务器端的,因此与5年后的问题无关,是吗?这会将整个资源放在DOM中,不是一个好方法。使用BLOBURI要好得多。
    <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>
    
    // 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);
    }