JavaScript實現寫入檔案到本地的方法【基於FileSaver.js外掛程式】,

來源:互聯網
上載者:User

JavaScript實現寫入檔案到本地的方法【基於FileSaver.js外掛程式】,

本文執行個體講述了JavaScript實現寫入檔案到本地的方法。分享給大家供大家參考,具體如下:

工作中有時需要通過 JavaScript 儲存檔案到本地,我們都知道 JavaScript 基於安全的考慮,是不允許直接操作本地檔案的。

IE 可以通過 VB 外掛程式的方式進行,而 Chrome 和 firefox 都不支援 JavaScript 向本地寫入檔案,所以 VB 外掛程式的方式存在相容性問題。

那有沒有適合的方法呢?答案是肯定的,我們可以通過 FileSaver.js 這個小外掛程式實現我們的需求。下面看一段具體的代碼吧:

/** * 下載檔案 */var downloadTextFile = function(mobileCode) {  if(isEmpty(mobileCode)) {    mobileCode = '';  }  var file = new File([mobileCode], "手機號.txt", { type: "text/plain;charset=utf-8" });  saveAs(file);}

這個樣本是向本機存放區一個名字叫“手機號.txt”的文字檔,採用的字元編碼格式為“UTF-8”,這樣就避免的中文亂碼的問題。聰明的你也趕快試試吧!

附 FileSaver.js 檔案的完整源碼:

/* FileSaver.js * A saveAs() FileSaver implementation. * 1.3.2 * 2016-06-16 18:25:19 * * By Eli Grey, http://eligrey.com * License: MIT *  See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md *//*global self *//*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true *//*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */var saveAs = saveAs || (function(view) {  "use strict";  // IE <10 is explicitly unsupported  if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {    return;  }  var     doc = view.document     // only get URL when necessary in case Blob.js hasn't overridden it yet    , get_URL = function() {      return view.URL || view.webkitURL || view;    }    , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")    , can_use_save_link = "download" in save_link    , click = function(node) {      var event = new MouseEvent("click");      node.dispatchEvent(event);    }    , is_safari = /constructor/i.test(view.HTMLElement) || view.safari    , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)    , throw_outside = function(ex) {      (view.setImmediate || view.setTimeout)(function() {        throw ex;      }, 0);    }    , force_saveable_type = "application/octet-stream"    // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to    , arbitrary_revoke_timeout = 1000 * 40 // in ms    , revoke = function(file) {      var revoker = function() {        if (typeof file === "string") { // file is an object URL          get_URL().revokeObjectURL(file);        } else { // file is a File          file.remove();        }      };      setTimeout(revoker, arbitrary_revoke_timeout);    }    , dispatch = function(filesaver, event_types, event) {      event_types = [].concat(event_types);      var i = event_types.length;      while (i--) {        var listener = filesaver["on" + event_types[i]];        if (typeof listener === "function") {          try {            listener.call(filesaver, event || filesaver);          } catch (ex) {            throw_outside(ex);          }        }      }    }    , auto_bom = function(blob) {      // prepend BOM for UTF-8 XML and text/* types (including HTML)      // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF      if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {        return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});      }      return blob;    }    , FileSaver = function(blob, name, no_auto_bom) {      if (!no_auto_bom) {        blob = auto_bom(blob);      }      // First try a.download, then web filesystem, then object URLs      var         filesaver = this        , type = blob.type        , force = type === force_saveable_type        , object_url        , dispatch_all = function() {          dispatch(filesaver, "writestart progress write writeend".split(" "));        }        // on any filesys errors revert to saving with object URLs        , fs_error = function() {          if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {            // Safari doesn't allow downloading of blob urls            var reader = new FileReader();            reader.onloadend = function() {              var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');              var popup = view.open(url, '_blank');              if(!popup) view.location.href = url;              url=undefined; // release reference before dispatching              filesaver.readyState = filesaver.DONE;              dispatch_all();            };            reader.readAsDataURL(blob);            filesaver.readyState = filesaver.INIT;            return;          }          // don't create more object URLs than needed          if (!object_url) {            object_url = get_URL().createObjectURL(blob);          }          if (force) {            view.location.href = object_url;          } else {            var opened = view.open(object_url, "_blank");            if (!opened) {              // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html              view.location.href = object_url;            }          }          filesaver.readyState = filesaver.DONE;          dispatch_all();          revoke(object_url);        }      ;      filesaver.readyState = filesaver.INIT;      if (can_use_save_link) {        object_url = get_URL().createObjectURL(blob);        setTimeout(function() {          save_link.href = object_url;          save_link.download = name;          click(save_link);          dispatch_all();          revoke(object_url);          filesaver.readyState = filesaver.DONE;        });        return;      }      fs_error();    }    , FS_proto = FileSaver.prototype    , saveAs = function(blob, name, no_auto_bom) {      return new FileSaver(blob, name || blob.name || "download", no_auto_bom);    }  ;  // IE 10+ (native saveAs)  if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {    return function(blob, name, no_auto_bom) {      name = name || blob.name || "download";      if (!no_auto_bom) {        blob = auto_bom(blob);      }      return navigator.msSaveOrOpenBlob(blob, name);    };  }  FS_proto.abort = function(){};  FS_proto.readyState = FS_proto.INIT = 0;  FS_proto.WRITING = 1;  FS_proto.DONE = 2;  FS_proto.error =  FS_proto.onwritestart =  FS_proto.onprogress =  FS_proto.onwrite =  FS_proto.onabort =  FS_proto.onerror =  FS_proto.onwriteend =    null;  return saveAs;}(    typeof self !== "undefined" && self  || typeof window !== "undefined" && window  || this.content));// `self` is undefined in Firefox for Android content script context// while `this` is nsIContentFrameMessageManager// with an attribute `content` that corresponds to the windowif (typeof module !== "undefined" && module.exports) { module.exports.saveAs = saveAs;} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) { define("FileSaver.js", function() {  return saveAs; });}

PS:本站線上工具http://tools.jb51.net上面工具中的很多檔案下載功能都是基於FileSaver.js外掛程式實現的,感興趣的朋友可以尋找參考一下。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.