Does execCommand SaveAs work in Firefox?
It is possible to do this in Firefox via data URIs (see also Download data url file ) and optionally via the download attribute.
See http://html5-demos.appspot.com/static/a.download.html for an HTML5 shim demo.
How to force save as dialog box in firefox besides changing headers? also covers this topic.
You can also test it by the following Firefox-tested demo.
<!DOCTYPE html><body><script>var a = document.createElement('a');//alert(a.download === ''); // If true, this seems to indicate supporta.setAttribute('download', 'testme.png');a.href = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4jWNgGPRgv7Y2z0lj45STpqbHT5iaxhCt8biBgcJJU9PZJ01MPp80MfkPxZOJN8DEpAFJ4/+TJib/T5mY7CdK8wkTkwJ0zVA8naDmk0ZGPjg0/z9hbGyDV/MZY2ORkyYm77FpPmVispwSp6/e7+DAQtj5pqabsdi8myjNUANmY7H99jEjIxWiDDhuauqCxYDD+7W1eYgy4IyxMetJE5PpyH4/ZWqqTZRmGIAm3fsk2YwOjhkZqZCtmVQAAIOlmIi0XoodAAAAAElFTkSuQmCC';a.innerHTML = 'testing';a.style.display = 'none';document.body.appendChild(a);a.click();</script>
The following also works for URLs as well as JavaScript-initiated loads without the download attribute (though this approach does not allow a file name, it does allow a preview in a new tab):
<script>var myText = 'Hello world!', myHTML = '<b>'+myText+'</b>';function openFile (textToEncode, contentType, newWindow) { // For window.btoa (base64) polyfills, see // https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills var encodedText = window.btoa(textToEncode); var dataURL = 'data:' + contentType + ';base64,' + encodedText; if (newWindow) { // Not useful for application/octet-stream type window.open(dataURL); // To open in a new tab/window } else { window.location = dataURL; // To change the current page }}</script><h1>Hello world files:</h1><p>Octet stream type to prompts download dialog in Firefox, but with no default file type or path:</p> <a href="data:application/octet-stream;base64,SGVsbG8sIFdvcmxkIQ%3D%3D"> (text example)</a><a href="data:application/octet-stream;base64,PGI+SGVsbG8gd29ybGQhPC9iPg=="> (HTML example)</a><button onclick="openFile(myHTML, 'application/octet-stream');"> (HTML example, from JavaScript)</button><p>Quickly viewable (and manually savable) in browser but no dialog presented:</p><a href="data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D">(plain text, same window)</a><a href="data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D" target="new-tab"> (plain text--in new tab)</a><a href="data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E">(HTML, same window)</a><button onclick="openFile(myText, 'text/plain');"> (text example, from JavaScript)</button><button onclick="openFile(myText, 'text/plain', true);"> (text example, from JavaScript; open in new window)</button><button onclick="openFile(myHTML, 'text/html', true);"> (HTML example, from JavaScript; open in new window)</button>
execCommand is not completely standardized across browsers. Indeed, execCommand('SaveAs', ...) only seems to be supported on IE. The recommended way to force a save-as would be to use a content-disposition: attachment header, as described in http://www.jtricks.com/bits/content_disposition.html
Since this is part of the HTTP header, you can use it on any file type. If you're using apache, you can add headers using the .htaccess file, as described here. For example:
<FilesMatch "\.pdf$"><IfModule mod_headers.c>Header set Content-Disposition "attachment"# for older browsersHeader set Content-Type "application/octet-stream"</IfModule></FilesMatch>