[原创]JS基于FileSaver.js插件实现文件保存功能示例


Posted in Javascript onDecember 08, 2016

本文实例讲述了JS基于FileSaver.js插件实现文件保存功能。分享给大家供大家参考,具体如下:

这里介绍一款js插件用法非常简单,先来看看FileSaver.js插件源码:

/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */

var saveAs=saveAs||function(e){"use strict";if(typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),i="download"in r,o=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},a=/Version\/[\d\.]+.*Safari/.test(navigator.userAgent),f=e.webkitRequestFileSystem,u=e.requestFileSystem||f||e.mozRequestFileSystem,s=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},c="application/octet-stream",d=0,l=500,w=function(t){var r=function(){if(typeof t==="string"){n().revokeObjectURL(t)}else{t.remove()}};if(e.chrome){r()}else{setTimeout(r,l)}},p=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var i=e["on"+t[r]];if(typeof i==="function"){try{i.call(e,n||e)}catch(o){s(o)}}}},v=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob(["\ufeff",e],{type:e.type})}return e},y=function(t,s,l){if(!l){t=v(t)}var y=this,m=t.type,S=false,h,R,O=function(){p(y,"writestart progress write writeend".split(" "))},g=function(){if(R&&a&&typeof FileReader!=="undefined"){var r=new FileReader;r.onloadend=function(){var e=r.result;R.location.href="data:attachment/file"+e.slice(e.search(/[,;]/));y.readyState=y.DONE;O()};r.readAsDataURL(t);y.readyState=y.INIT;return}if(S||!h){h=n().createObjectURL(t)}if(R){R.location.href=h}else{var i=e.open(h,"_blank");if(i==undefined&&a){e.location.href=h}}y.readyState=y.DONE;O();w(h)},b=function(e){return function(){if(y.readyState!==y.DONE){return e.apply(this,arguments)}}},E={create:true,exclusive:false},N;y.readyState=y.INIT;if(!s){s="download"}if(i){h=n().createObjectURL(t);r.href=h;r.download=s;setTimeout(function(){o(r);O();w(h);y.readyState=y.DONE});return}if(e.chrome&&m&&m!==c){N=t.slice||t.webkitSlice;t=N.call(t,0,t.size,c);S=true}if(f&&s!=="download"){s+=".download"}if(m===c||f){R=e}if(!u){g();return}d+=t.size;u(e.TEMPORARY,d,b(function(e){e.root.getDirectory("saved",E,b(function(e){var n=function(){e.getFile(s,E,b(function(e){e.createWriter(b(function(n){n.onwriteend=function(t){R.location.href=e.toURL();y.readyState=y.DONE;p(y,"writeend",t);w(e)};n.onerror=function(){var e=n.error;if(e.code!==e.ABORT_ERR){g()}};"writestart progress write abort".split(" ").forEach(function(e){n["on"+e]=y["on"+e]});n.write(t);y.abort=function(){n.abort();y.readyState=y.DONE};y.readyState=y.WRITING}),g)}),g)};e.getFile(s,{create:false},b(function(e){e.remove();n()}),b(function(e){if(e.code===e.NOT_FOUND_ERR){n()}else{g()}}))}),g)}),g)},m=y.prototype,S=function(e,t,n){return new y(e,t,n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){if(!n){e=v(e)}return navigator.msSaveOrOpenBlob(e,t||"download")}}m.abort=function(){var e=this;e.readyState=e.DONE;p(e,"abort")};m.readyState=m.INIT=0;m.WRITING=1;m.DONE=2;m.error=m.onwritestart=m.onprogress=m.onwrite=m.onabort=m.onerror=m.onwriteend=null;return S}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!=null){define([],function(){return saveAs})}

源码可读性不敢恭维,让我们用本站的JS在线工具:http://tools.3water.com/code/js 格式化一下,方便以后阅读研究。

格式化后的代码如下:

/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
var saveAs = saveAs ||
function(e) {
  "use strict";
  if (typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
    return
  }
  var t = e.document,
  n = function() {
    return e.URL || e.webkitURL || e
  },
  r = t.createElementNS("http://www.w3.org/1999/xhtml", "a"),
  i = "download" in r,
  o = function(e) {
    var t = new MouseEvent("click");
    e.dispatchEvent(t)
  },
  a = /Version\/[\d\.]+.*Safari/.test(navigator.userAgent),
  f = e.webkitRequestFileSystem,
  u = e.requestFileSystem || f || e.mozRequestFileSystem,
  s = function(t) { (e.setImmediate || e.setTimeout)(function() {
      throw t
    },
    0)
  },
  c = "application/octet-stream",
  d = 0,
  l = 500,
  w = function(t) {
    var r = function() {
      if (typeof t === "string") {
        n().revokeObjectURL(t)
      } else {
        t.remove()
      }
    };
    if (e.chrome) {
      r()
    } else {
      setTimeout(r, l)
    }
  },
  p = function(e, t, n) {
    t = [].concat(t);
    var r = t.length;
    while (r--) {
      var i = e["on" + t[r]];
      if (typeof i === "function") {
        try {
          i.call(e, n || e)
        } catch(o) {
          s(o)
        }
      }
    }
  },
  v = function(e) {
    if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)) {
      return new Blob(["\ufeff", e], {
        type: e.type
      })
    }
    return e
  },
  y = function(t, s, l) {
    if (!l) {
      t = v(t)
    }
    var y = this,
    m = t.type,
    S = false,
    h, R, O = function() {
      p(y, "writestart progress write writeend".split(" "))
    },
    g = function() {
      if (R && a && typeof FileReader !== "undefined") {
        var r = new FileReader;
        r.onloadend = function() {
          var e = r.result;
          R.location.href = "data:attachment/file" + e.slice(e.search(/[,;]/));
          y.readyState = y.DONE;
          O()
        };
        r.readAsDataURL(t);
        y.readyState = y.INIT;
        return
      }
      if (S || !h) {
        h = n().createObjectURL(t)
      }
      if (R) {
        R.location.href = h
      } else {
        var i = e.open(h, "_blank");
        if (i == undefined && a) {
          e.location.href = h
        }
      }
      y.readyState = y.DONE;
      O();
      w(h)
    },
    b = function(e) {
      return function() {
        if (y.readyState !== y.DONE) {
          return e.apply(this, arguments)
        }
      }
    },
    E = {
      create: true,
      exclusive: false
    },
    N;
    y.readyState = y.INIT;
    if (!s) {
      s = "download"
    }
    if (i) {
      h = n().createObjectURL(t);
      r.href = h;
      r.download = s;
      setTimeout(function() {
        o(r);
        O();
        w(h);
        y.readyState = y.DONE
      });
      return
    }
    if (e.chrome && m && m !== c) {
      N = t.slice || t.webkitSlice;
      t = N.call(t, 0, t.size, c);
      S = true
    }
    if (f && s !== "download") {
      s += ".download"
    }
    if (m === c || f) {
      R = e
    }
    if (!u) {
      g();
      return
    }
    d += t.size;
    u(e.TEMPORARY, d, b(function(e) {
      e.root.getDirectory("saved", E, b(function(e) {
        var n = function() {
          e.getFile(s, E, b(function(e) {
            e.createWriter(b(function(n) {
              n.onwriteend = function(t) {
                R.location.href = e.toURL();
                y.readyState = y.DONE;
                p(y, "writeend", t);
                w(e)
              };
              n.onerror = function() {
                var e = n.error;
                if (e.code !== e.ABORT_ERR) {
                  g()
                }
              };
              "writestart progress write abort".split(" ").forEach(function(e) {
                n["on" + e] = y["on" + e]
              });
              n.write(t);
              y.abort = function() {
                n.abort();
                y.readyState = y.DONE
              };
              y.readyState = y.WRITING
            }), g)
          }), g)
        };
        e.getFile(s, {
          create: false
        },
        b(function(e) {
          e.remove();
          n()
        }), b(function(e) {
          if (e.code === e.NOT_FOUND_ERR) {
            n()
          } else {
            g()
          }
        }))
      }), g)
    }), g)
  },
  m = y.prototype,
  S = function(e, t, n) {
    return new y(e, t, n)
  };
  if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
    return function(e, t, n) {
      if (!n) {
        e = v(e)
      }
      return navigator.msSaveOrOpenBlob(e, t || "download")
    }
  }
  m.abort = function() {
    var e = this;
    e.readyState = e.DONE;
    p(e, "abort")
  };
  m.readyState = m.INIT = 0;
  m.WRITING = 1;
  m.DONE = 2;
  m.error = m.onwritestart = m.onprogress = m.onwrite = m.onabort = m.onerror = m.onwriteend = null;
  return S
} (typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content);
if (typeof module !== "undefined" && module.exports) {
  module.exports.saveAs = saveAs
} else if (typeof define !== "undefined" && define !== null && define.amd != null) {
  define([],
  function() {
    return saveAs
  })
}

使用的时候非常简单,代码如下所示:

var blob = new Blob(['out_put_string'], {type: "text/plain;charset=utf-8"});//out_put_string为需要保存到文件的字符串内容
saveAs(blob, "filename.php");//filename.php为保存的文件名

PS:本站在线工具《PHP代码在线格式化美化工具》中的保存文本功能使用的就是FileSaver.js插件实现的。感兴趣的朋友可以参考一下:

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Extjs入门之动态加载树代码
Apr 09 Javascript
Jquery 动态生成表格示例代码
Dec 24 Javascript
js处理自己不能定义二维数组的方法详解
Mar 03 Javascript
不定义JQuery插件 不要说会JQuery
Mar 07 Javascript
使用Object.defineProperty实现简单的js双向绑定
Apr 15 Javascript
JS实现列表的响应式排版(推荐)
Sep 01 Javascript
jQuery简单实现列表隐藏和显示效果示例
Sep 12 Javascript
jquery网页加载进度条的实现
Jun 01 jQuery
vue安装和使用scss及sass与scss的区别详解
Oct 15 Javascript
jquery实现动态添加附件功能
Oct 23 jQuery
利用React Router4实现的服务端直出渲染(SSR)
Jan 07 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
Nov 07 Javascript
浅析如何利用angular结合translate为项目实现国际化
Dec 08 #Javascript
Jquery on绑定的事件 触发多次实例代码
Dec 08 #Javascript
Bootstrap基本组件学习笔记之进度条(15)
Dec 08 #Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
Dec 08 #Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
Dec 08 #Javascript
Bootstrap基本组件学习笔记之面板(14)
Dec 08 #Javascript
Bootstrap基本组件学习笔记之缩略图(13)
Dec 08 #Javascript
You might like
php ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
javascript 动态生成私有变量访问器
2009/12/06 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
原始XMLHttpRequest方法详情回顾
2013/11/28 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
使用JavaScript 编写简单计算器
2014/11/24 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
2015/04/06 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
Python中请使用isinstance()判断变量类型
2014/08/25 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
学校门卫工作职责
2013/12/07 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
房地产还款计划书
2014/01/10 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
士兵突击观后感
2015/06/16 职场文书
Go语言grpc和protobuf
2022/04/13 Golang