2009-05-07 13 views
7

Perché questo non funziona in ff/chrome?execCommand SaveAs funziona in Firefox?

javascript: document.execCommand('SaveAs','true','http://www.google.com'); 

(usato come bookmarklet)

+0

grazie per le risposte. per essere più specifico, sto cercando di forzare un salvataggio, come su un file pdf che ho sul web. c'è un modo per farlo in ff? –

+0

No 30 minuti dopo dallo stesso utente: [Come forzare il salvataggio come finestra di dialogo in firefox oltre a modificare le intestazioni?] (Http://stackoverflow.com/questions/833068/how-to-force-save-as-dialog- box-in-firefox-Oltre-cambiando-intestazioni) – hakre

risposta

9

execCommand non è completamente standardizzato tra i browser. Infatti, execCommand ('SaveAs', ...) sembra essere supportato su IE. Il metodo consigliato per forzare un salvataggio, come sarebbe utilizzare un'intestazione content-disposition: attachment, come descritto in http://www.jtricks.com/bits/content_disposition.html

Poiché questo fa parte dell'intestazione HTTP, è possibile utilizzarlo su qualsiasi tipo di file. Se utilizzi apache, puoi aggiungere intestazioni utilizzando il file .htaccess, come descritto here. Ad esempio:

<FilesMatch "\.pdf$"> 
<IfModule mod_headers.c> 
Header set Content-Disposition "attachment" 
# for older browsers 
Header set Content-Type "application/octet-stream" 
</IfModule> 
</FilesMatch> 
+0

sto provando a forzare un salvataggio, come su un file pdf. non penso di poter cambiare le intestazioni –

+0

Penso che la disposizione del contenuto sia parte dell'intestazione HTTP, non parte del documento, quindi dovresti essere in grado di usarlo per i file pdf. – Andrej

+0

In effetti puoi, ed ecco un esempio di questo :) – bdonlan

3

Come Microsoft puts it, "non esiste uno standard pubblico che si applica a questo metodo."

0

Firefox non supporta execCommand. In realtà sembra essere solo IE.

+0

esiste una funzione firefox simile? –

+0

non che io sappia, vorrete usare l'intestazione content-disposition come suggerisce bdonlan. –

+0

It (o almeno 'execCommand', non' execCommand (saveAs) ') è [documentato su MDN] (https://developer.mozilla.org/en/rich-text_editing_in_mozilla) come supportato in Mozilla 1.3+ – Rup

8

È possibile farlo in Firefox tramite data URIs (vedere anche Download data url file) e facoltativamente tramite l'attributo di download.

Vedere http://html5-demos.appspot.com/static/a.download.html per una demo di shim HTML5.

How to force save as dialog box in firefox besides changing headers? copre anche questo argomento.

È anche possibile testarlo dalla seguente demo testata da 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> 

Di seguito funziona anche per gli URL, così come i carichi JavaScript-avviate senza l'attributo download (anche se questo approccio non consente un nome di file, se non è permessa in anteprima in una nuova scheda):

<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> 
+0

Loop in menzionando diverse domande, sono venuto da [Come forzare salvare come finestra di dialogo in Firefox oltre a cambiare le intestazioni?] (http://stackoverflow.com/questions/833068/how-to-force-save-as-dialog-box-in -firefox-oltre-cambia-header) – Juto

Problemi correlati