【问题标题】:Client side file creation and download客户端文件创建和下载
【发布时间】:2011-02-24 17:06:52
【问题描述】:

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

【问题讨论】:

标签: javascript html


【解决方案1】:

尝试下面的代码允许您访问客户端文件系统,但这仅适用于 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>

【讨论】:

  • 就这个例子来说很好的解决方案,但我认为我们不应该以特定于浏览器的方式实现任何东西,我们是在 2011 年而不是 1998 年,人们使用 Chrome、Opera、Safari、IE、火狐、移动浏览器...
  • @Davide - 我只是展示了增加他的知识的方法,我们可以在 ie 浏览器中做到这一点,我的回答是一些如何满足他的一半要求.. 我的回答不在此范围内问题......你写的我已经知道......并且已经在我的回答中写道这是工作形式,即仅
  • 我明白你的意思,但要注意我们不应该针对任何特定的浏览器或操作系统,上面的代码可能会在 ipad 或任何其他非 Windows 平台上失败。
【解决方案2】:

看看filesaver.js。只要您对 IE10+ 没问题,这是一个非常可靠的解决方案,可以根据浏览器使用最佳方法优雅地处理。

【讨论】:

    【解决方案3】:

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

    这源自 Marc 引用的答案,这在您没有专门点击链接标签的情况下很有用: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);
    }
    

    【讨论】:

    • 5 年后吧?哈哈
    • 这会将整个资源放在 DOM 中,这不是一个好方法。最好使用 Blob URI。
    【解决方案4】:

    设计使您无法使用 Javascript 访问本地磁盘。

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

    【讨论】:

    • 文件系统 API 规范 ^^ 自 2014 年 4 月起已被取消。
    【解决方案5】:

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

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

    解决办法如下:

    1. 我在 SmartClient 上构建项目。我们需要下载/导出网格的数据 (类似表格的结构)。
    2. 我们使用 RESTish Web 服务从服务器端提供数据。所以我不能两次点击网址;一次用于网格,第二次用于导出/转换数据以下载。
    3. 我所做的是制作了两个 JSP,即:blank.jsp 和 export.jsp。
    4. blank.jsp 实际上是空白的,现在我需要导出网格数据 我已经在客户端了。
    5. 现在,当用户要求导出网格数据时,我会执行以下操作:
      1. 使用 url 为空白.jsp 打开一个新窗口
      2. 使用 document.write 我在其中创建了一个表单,其中包含一个字段名称文本,并设置要在其中导出的数据。
      3. 现在将该表单发布到相同层次结构的 export.jsp。
      4. 我在下面粘贴的 export.jsp 的内容是不言自明的。
    <%@ 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>
    

    此代码在生产环境中经过测试和部署/工作,这也是跨浏览器的功能。

    【讨论】:

    • 这完全是服务器端的,所以与问题无关
    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2017-08-06
    • 2014-07-05
    • 2018-12-01
    相关资源
    最近更新 更多