Est-ce que execCommand SaveAs fonctionne dans Firefox?
-
08-07-2019 - |
Question
Pourquoi cela ne fonctionne-t-il pas dans ff / chrome?
javascript: document.execCommand('SaveAs','true','http://www.google.com');
(utilisé comme bookmarklet)
La solution
execCommand n'est pas complètement normalisé sur tous les navigateurs. En effet, execCommand ('SaveAs', ...) ne semble être supporté que par IE. La méthode recommandée pour forcer un enregistrement dans l’enregistrement consiste à utiliser un en-tête content-disposition: attachment, comme décrit dans http://www.jtricks.com/bits/content_disposition.html
Comme cela fait partie de l’en-tête HTTP, vous pouvez l’utiliser sur n’importe quel type de fichier. Si vous utilisez apache, vous pouvez ajouter des en-têtes à l'aide du fichier .htaccess, comme décrit ici . Par exemple:
<FilesMatch "\.pdf<*>quot;>
<IfModule mod_headers.c>
Header set Content-Disposition "attachment"
# for older browsers
Header set Content-Type "application/octet-stream"
</IfModule>
</FilesMatch>
Autres conseils
Il est possible de le faire dans Firefox via URI de données (voir Télécharger le fichier d'URL des données ) et éventuellement via l'attribut de téléchargement.
Voir http://html5-demos.appspot.com/static/ a.download.html pour une démo HTML5 shim.
Comment forcer la sauvegarde sous La boîte de dialogue de Firefox, en plus de changer d’en-tête? , couvre également ce sujet.
Vous pouvez également le tester à l'aide de la démonstration suivante testée par Firefox.
<!DOCTYPE html>
<body>
<script>
var a = document.createElement('a');
//alert(a.download === ''); // If true, this seems to indicate support
a.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>
Ce qui suit fonctionne également pour les URL ainsi que pour les chargements initiés par JavaScript sans attribut de téléchargement (bien que cette approche n'autorise pas le nom de fichier, elle autorise un aperçu dans un nouvel onglet):
<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>
Comme Microsoft l'exprime , "Il n'y a pas de public norme applicable à cette méthode. "
Firefox ne supporte pas execCommand. En fait, cela semble être uniquement pour IE.