在Javascript中从本地数据保存文件

时间:2010-05-04 01:22:20

标签: javascript

见下面的情景:

  1. 用户访问我的网站并打开一个包含一些javascript功能的网页。
  2. 用户通过javascript
  3. 编辑数据
  4. 用户点击保存按钮来保存数据,事情是,似乎他们不需要下载这些数据,因为它已经在本地机器上的javascript中。
  5. 是否可以在不从服务器下载文件的情况下从javascript(从国外网页执行)保存数据?

    非常感谢任何帮助!

5 个答案:

答案 0 :(得分:5)

为了在客户端保存数据,没有任何服务器交互,我见过的最好的是Downloadify,是一个小的JavaScript + Flash库,允许您直接生成和保存文件。浏览器......

选中demo

答案 1 :(得分:5)

当我想在不使用服务器的情况下启动下载时,我遇到了这种情况。我写了这个jQuery插件,它在Blob中包含了textarea / div的内容,然后启动了Blob的下载。允许您指定文件名和类型..

jQuery.fn.downld = function (ops) {
  this.each(function () {
    var _ops = ops || {}, 
    file_name = _ops.name || "downld_file",
    file_type = _ops.type || "txt",
    file_content = $(this).val() || $(this).html();

    var _file = new Blob([file_content],{type:'application/octet-stream'});
    window.URL = window.URL || window.webkitURL;

    var a = document.createElement('a');
    a.href = window.URL.createObjectURL(_file); 
    a.download = file_name+"."+file_type;
    document.body.appendChild(a);
    a.click(); $('a').last().remove();
  });
}

默认使用:$(“#element”)。downld();
选项:$(“#element”)。downld({name:“some_file_name”,type:“html”});

Codepen示例http://codepen.io/anon/pen/cAqzE

答案 2 :(得分:3)

JavaScript在sandboxed环境中运行,这意味着它只能访问特定的浏览器资源。具体来说,它无权访问文件系统或来自其他域(网页,javascript等)的动态资源。好吧,还有其他的东西(I / O,设备),但你明白了。

您需要将数据发布到可以调用文件下载的服务器,或者使用其他技术,如flash,java applet或silverlight。 (我不确定在过去2中对此的支持,我也不建议使用它们,取决于它的用途......)

答案 3 :(得分:1)

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

以下是解决方案:

  1. 我在SmartClient的项目构建中。我们需要下载/导出网格数据 (表格式结构)。
  2. 我们使用RESTish Web服务来提供服务器端的数据。所以我无法打两次网址;一个用于网格,另一个用于导出/转换要下载的数据。
  3. 我做了两个JSP,即:blank.jsp和export.jsp。
  4. blank.jsp实际上是空白的,现在我需要导出网格数据 我已经在客户端。
  5. 现在,当用户要求导出网格数据时,我会在下面执行:     一个。使用url blank.jsp打开一个新窗口     湾使用document.write我在其中创建一个表单,其中包含一个字段名称文本,并设置数据以在其中导出。     C。现在将该表单POST到相同层次的export.jsp。     d。我在下面粘贴的export.jsp的内容是不言自明的。
  6. //代码开始

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

    //代码结束

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

    由于 SHAILENDRA

答案 4 :(得分:0)

您可以在Cookie中保存少量数据。