You can save any file, or DataURL, or Blob on disk using HTML5's newly introduced "download" attribute.
Use cases:
1. Force browser to download/save files like PDF/HTML/PHP/ASPX/JS/CSS/etc. on disk
2. Concatenate all transmitted blobs and save them as file on disk - it is useful in file sharing applications
Microsoft Edge? (msSaveBlob/msSaveOrOpenBlob) https://msdn.microsoft.com/en-us/library/hh779016(v=vs.85).aspx
Here is how to use above function:
You can pass two arguments over "SaveToDisk" function:
1. file-URL or blob or data-URL - it is mandatory
2. file name - it is optional
Here is "SaveToDisk" function uses new syntax of "createEvent" API:
Here is "SaveToDisk" function uses old syntax of "createEvent" API:
You can use FileReader too, to save "Blob" on disk:
Using "SaveToDisk" function
Force an image to be saved on disk instead of rendered by the browser:
Force downloading of pdf files (it will NEVER allow any browser specific pdf-reader to render/open your pdf files):
Even you can enforce following web-browser specific files to be downloaded/saved on the disk instead of rendered within the browser!
Following apps are using "SaveToDisk" function to save files/blobs/etc. on disk:
Specification
1. https://developer.mozilla.org/en-US/docs/DOM/document.createEvent
2. http://www.w3.org/TR/DOM-Level-3-Events/#events-Events-DocumentEvent-createEvent
Remember, "SaveToDisk" works fine on Firefox nightly and aurora.
To support Firefox general release; use same workaround that is used for IE in this post (with a little bit changes).
If Firefox fails:
It seems that firefox doesn't allows dispatching (click) event handlers if HYPER-LINK element is NOT in the DOM-tree.
Don't call "revokeObjectURL" outside the "onclick" handler.
You simply need to append HYPER-LINK element into DOM; and remove it after "onclick" is fired:
Use cases:
1. Force browser to download/save files like PDF/HTML/PHP/ASPX/JS/CSS/etc. on disk
2. Concatenate all transmitted blobs and save them as file on disk - it is useful in file sharing applications
Microsoft Edge? (msSaveBlob/msSaveOrOpenBlob) https://msdn.microsoft.com/en-us/library/hh779016(v=vs.85).aspx
/** * @param {Blob} file - File or Blob object. This parameter is required. * @param {string} fileName - Optional file name e.g. "image.png" */ function invokeSaveAsDialog(file, fileName) { if (!file) { throw 'Blob object is required.'; } if (!file.type) { try { file.type = 'video/webm'; } catch (e) {} } var fileExtension = (file.type || 'video/webm').split('/')[1]; if (fileName && fileName.indexOf('.') !== -1) { var splitted = fileName.split('.'); fileName = splitted[0]; fileExtension = splitted[1]; } var fileFullName = (fileName || (Math.round(Math.random() * 9999999999) + 888888888)) + '.' + fileExtension; if (typeof navigator.msSaveOrOpenBlob !== 'undefined') { return navigator.msSaveOrOpenBlob(file, fileFullName); } else if (typeof navigator.msSaveBlob !== 'undefined') { return navigator.msSaveBlob(file, fileFullName); } var hyperlink = document.createElement('a'); hyperlink.href = URL.createObjectURL(file); hyperlink.download = fileFullName; hyperlink.style = 'display:none;opacity:0;color:transparent;'; (document.body || document.documentElement).appendChild(hyperlink); if (typeof hyperlink.click === 'function') { hyperlink.click(); } else { hyperlink.target = '_blank'; hyperlink.dispatchEvent(new MouseEvent('click', { view: window, bubbles: true, cancelable: true })); } (window.URL || window.webkitURL).revokeObjectURL(hyperlink.href); }
Here is how to use above function:
var textFile = new Blob(['Hello Sir'], { type: 'text/plain' }); invokeSaveAsDialog(textFile, 'TextFile.txt');
You can pass two arguments over "SaveToDisk" function:
1. file-URL or blob or data-URL - it is mandatory
2. file name - it is optional
Here is "SaveToDisk" function uses new syntax of "createEvent" API:
function SaveToDisk(fileURL, fileName) { // for non-IE if (!window.ActiveXObject) { var save = document.createElement('a'); save.href = fileURL; save.download = fileName || 'unknown'; save.style = 'display:none;opacity:0;color:transparent;'; (document.body || document.documentElement).appendChild(save); if (typeof save.click === 'function') { save.click(); } else { save.target = '_blank'; var event = document.createEvent('Event'); event.initEvent('click', true, true); save.dispatchEvent(event); } (window.URL || window.webkitURL).revokeObjectURL(save.href); } // for IE else if (!!window.ActiveXObject && document.execCommand) { var _window = window.open(fileURL, '_blank'); _window.document.close(); _window.document.execCommand('SaveAs', true, fileName || fileURL) _window.close(); } }
Here is "SaveToDisk" function uses old syntax of "createEvent" API:
function SaveToDisk(fileURL, fileName) { // for non-IE if (!window.ActiveXObject) { var save = document.createElement('a'); save.href = fileURL; save.target = '_blank'; save.download = fileName || fileURL; var evt = document.createEvent('MouseEvents'); evt.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null); save.dispatchEvent(evt); (window.URL || window.webkitURL).revokeObjectURL(save.href); } // for IE else if ( !! window.ActiveXObject && document.execCommand) { var _window = window.open(fileURL, "_blank"); _window.document.close(); _window.document.execCommand('SaveAs', true, fileName || fileURL) _window.close(); } }
You can use FileReader too, to save "Blob" on disk:
function SaveToDisk(blobURL, fileName) { var reader = new FileReader(); reader.readAsDataURL(blobURL); reader.onload = function(event) { var save = document.createElement('a'); save.href = event.target.result; save.download = fileName || 'unknown file'; save.style = 'display:none;opacity:0;color:transparent;'; (document.body || document.documentElement).appendChild(save); if (typeof save.click === 'function') { save.click(); } else { save.target = '_blank'; var event = document.createEvent('Event'); event.initEvent('click', true, true); save.dispatchEvent(event); } (window.URL || window.webkitURL).revokeObjectURL(save.href); }; }
Using "SaveToDisk" function
Force an image to be saved on disk instead of rendered by the browser:
SaveToDisk('https://muazkh.appspot.com/images/Curvature.PNG', 'image.png');
Force downloading of pdf files (it will NEVER allow any browser specific pdf-reader to render/open your pdf files):
SaveToDisk('https://muazkh.googlecode.com/files/Muaz-Khan-CV.pdf');
Even you can enforce following web-browser specific files to be downloaded/saved on the disk instead of rendered within the browser!
JavaScript | SaveToDisk('/javascript-file.js') |
HTML | SaveToDisk('/html-file.html') |
CSS | SaveToDisk('/css-file.css') |
ASPX | SaveToDisk('/aspx-file.aspx') |
PHP | SaveToDisk('/php-file.php') |
MVC | SaveToDisk('/controller/action-method') |
Following apps are using "SaveToDisk" function to save files/blobs/etc. on disk:
DataChannel.js | A library for realtime data/file sharing using WebRTC! |
RTCMultiConnection.js | A library for realtime audio/video/screen/data and file sharing using WebRTC! |
Group File Sharing | Sharing files over multiple peer connections concurrently |
RecordRTC | A library for WebRTC-Developers to record audio and video streams |
Specification
1. https://developer.mozilla.org/en-US/docs/DOM/document.createEvent
2. http://www.w3.org/TR/DOM-Level-3-Events/#events-Events-DocumentEvent-createEvent
function SaveToDisk(fileUrl, fileName) { var hyperlink = document.createElement('a'); hyperlink.href = fileUrl; hyperlink.download = fileName || fileUrl; hyperlink.style = 'display:none;opacity:0;color:transparent;'; (document.body || document.documentElement).appendChild(hyperlink); if (typeof hyperlink.click === 'function') { hyperlink.click(); } else { hyperlink.target = '_blank'; hyperlink.dispatchEvent(new MouseEvent('click', { view: window, bubbles: true, cancelable: true })); } (window.URL || window.webkitURL).revokeObjectURL(hyperlink.href); }
Remember, "SaveToDisk" works fine on Firefox nightly and aurora.
To support Firefox general release; use same workaround that is used for IE in this post (with a little bit changes).
If Firefox fails:
It seems that firefox doesn't allows dispatching (click) event handlers if HYPER-LINK element is NOT in the DOM-tree.
Don't call "revokeObjectURL" outside the "onclick" handler.
You simply need to append HYPER-LINK element into DOM; and remove it after "onclick" is fired:
function SaveToDisk(fileUrl, fileName) { var hyperlink = document.createElement('a'); hyperlink.href = fileUrl; hyperlink.download = fileName || fileUrl; hyperlink.style = 'display:none;opacity:0;color:transparent;'; (document.body || document.documentElement).appendChild(hyperlink); hyperlink.onclick = function() { hyperlink.parentNode.removeChild(hyperlink); (window.URL || window.webkitURL).revokeObjectURL(hyperlink.href); }; if (typeof hyperlink.click === 'function') { hyperlink.click(); } else { hyperlink.target = '_blank'; hyperlink.dispatchEvent(new MouseEvent('click', { view: window, bubbles: true, cancelable: true })); } }