2009-05-07 29 views
7

¿Por qué esto no funciona en ff/cromo?¿ExecCommand SaveAs funciona en Firefox?

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

(utilizado como un bookmarklet)

+0

gracias por las respuestas. para ser más específico, estoy tratando de forzar un save-as en un archivo pdf que tengo en la web. ¿Hay alguna manera en que pueda hacer esto en ff? –

+0

No 30 minutos después por el mismo usuario: [¿Cómo forzar guardar como cuadro de diálogo en Firefox además de cambiar los encabezados?] (Http://stackoverflow.com/questions/833068/how-to-force-save-as-dialog- box-in-firefox-además-cambio-encabezados) – hakre

Respuesta

9

execCommand no está completamente estandarizado en todos los navegadores. De hecho, execCommand ('SaveAs', ...) solo parece ser compatible con IE. La forma recomendada de forzar un guardado como sería usar una disposición de contenido: encabezado de archivo adjunto, como se describe en http://www.jtricks.com/bits/content_disposition.html

Dado que esto es parte del encabezado HTTP, puede usarlo en cualquier tipo de archivo. Si está utilizando apache, puede agregar encabezados usando el archivo .htaccess, como se describe en here. Por ejemplo:

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

estoy tratando de forzar un save-as en un archivo pdf. No creo que pueda cambiar los encabezados –

+0

Creo que la disposición del contenido forma parte del encabezado HTTP, no forma parte del documento, por lo que debería poder usarlo para archivos PDF. – Andrej

+0

De hecho, puedes, y aquí hay un ejemplo de eso :) – bdonlan

3

Como Microsoft puts it, "no existe una norma pública que se aplica a este método."

0

Firefox no es compatible con execCommand. De hecho, parece ser solo IE.

+0

¿hay una función similar de Firefox? –

+0

que no sepa, querrá usar el encabezado de disposición de contenido como sugiere bdonlan. –

+0

(o al menos 'execCommand', no' execCommand (saveAs) ') está [documentado en MDN] (https://developer.mozilla.org/en/rich-text_editing_in_mozilla) como se admite en Mozilla 1.3+ – Rup

8

Es posible hacerlo en Firefox a través de data URIs (consulte también Download data url file) y opcionalmente mediante el atributo de descarga.

Consulte http://html5-demos.appspot.com/static/a.download.html para ver una demostración de shim HTML5.

How to force save as dialog box in firefox besides changing headers? también cubre este tema.

También puede probarlo mediante la siguiente demostración probada por 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> 

Lo siguiente también funciona para las direcciones URL, así como cargas iniciadas en JavaScript sin el atributo descarga (aunque este enfoque no permite un nombre de archivo, sí permite una vista previa en una nueva pestaña):

<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 mencionando diferentes preguntas, vengo de [Cómo forzar a guardar como cuadro de diálogo en Firefox además de cambiar los encabezados?] (http://stackoverflow.com/questions/833068/how-to-force-save-as-dialog-box-in -firefox-además-cambiando-encabezados) – Juto

Cuestiones relacionadas