execCommand SaveAs 在 Firefox 中工作吗?

IT技术 javascript firefox google-chrome bookmarklet
2021-02-10 17:10:33

为什么这在 ff/chrome 中不起作用?

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

(用作书签)

4个回答

在 Firefox 中可以通过数据 URI(另请参阅下载数据 url 文件)和可选的下载属性来执行此操作

有关HTML5 垫片演示,请参阅http://html5-demos.appspot.com/static/a.download.html

除了更改标题外,如何在 Firefox 中强制另存为对话框?也涵盖了这个话题。

您还可以通过以下经过 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>

以下内容也适用于 URL 以及没有下载属性的 JavaScript 启动的加载(尽管这种方法不允许使用文件名,但它允许在新选项卡中进行预览):

<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>
2021-03-14 17:10:33

execCommand 并未跨浏览器完全标准化。事实上, execCommand('SaveAs', ...) 似乎只在 IE 上受支持。强制另存为的推荐方法是使用内容处置:附件标头,如http://www.jtricks.com/bits/content_disposition.html 中所述

由于这是 HTTP 标头的一部分,因此您可以在任何文件类型上使用它。如果你使用Apache,您可以使用.htaccess文件添加标题,描述在这里例如:

<FilesMatch "\.pdf$">
<IfModule mod_headers.c>
Header set Content-Disposition "attachment"
# for older browsers
Header set Content-Type "application/octet-stream"
</IfModule>
</FilesMatch>
哇,这是一个很棒的主意。谢谢!你知道我是否可以做些什么来强制将 pdf 文件另存为不在我的服务器上?
2021-03-14 17:10:33
但更严重的是,我不知道。尝试提出有关该特定主题的另一个问题,也许其他人会这样做。
2021-03-18 17:10:33
我正在尝试对 pdf 文件强制另存为。我不认为我可以更改标题
2021-03-22 17:10:33
确实可以,这是一个例子:)
2021-03-23 17:10:33
我认为内容处置是 HTTP 标头的一部分,而不是文档的一部分,因此您应该能够将它用于 pdf 文件。
2021-04-04 17:10:33

正如微软所说,“没有适用于这种方法的公共标准。”

Firefox 不支持 execCommand。事实上,它似乎仅限于 IE。

有类似的火狐功能吗?
2021-03-20 17:10:33
不是我所知道的,您会想要使用 bdonlan 建议的内容处置标头。
2021-03-22 17:10:33
它(或至少execCommand,不是execCommand(saveAs)在 MDN 上记录为 Mozilla 1.3+ 支持
2021-03-28 17:10:33