如何在火狐浏览器中强制使用“另存为”对话框,而不是更改标题?

6
有没有一种方法可以在ff中强制出现“另存为”对话框,用于www.example.com/example.pdf?(我无法更改标头)
2个回答

4
如果您可以将文件以base64格式输出到客户端,您可以使用data uri来进行下载。
location.href = 'data:application/octet-stream;base64,' + appendPDFContentHere
OR
<a href="data:application/octet-stream;base64,appendPDFContentHere">pdf</a>

这只适用于非IE浏览器,但是由于您要求在Firefox中使用,这应该可以很好地工作。
编辑:
下面的两个示例都包含制作PNG的字节。如果单击第一个链接,您可以像在浏览器中一样查看图像。但是,如果单击第二个链接,它将强制您下载图像。将其保存为.png文件,您将看到它们是完全相同的图像。两个链接之间唯一的区别在于mime类型。 查看图像 (预览缩短网址) -- mime类型:image/png 下载图像 (预览缩短网址) -- mime类型:application/octet-stream
您询问了您要放置在appendPDFContentHere位置的内容,答案是组成PDF的base64编码字节。我使用了这个在线base64编码器来编码示例中使用的图像。

我应该把什么放在“追加PDF内容在此处”? 整个PDF吗? - raj
不,如果你只是输入URL,你无法添加MIME类型(application/octet-stream)。 - Matthew Flaschen
@Tom:预览链接仍然可用,底部的“继续”按钮也可以正常点击。似乎直接链接出现了问题。 - fearphage
@fearphage:抱歉,我几天前尝试时它没有起作用;我不知道问题出在哪里,但现在确实可以工作了。谢谢! - Tom

2
我能想到的另一种方法是修改Firefox设置。我猜您不能这样做。
编辑:
我根据数据URI的想法拼凑了一个客户端解决方案。它使用了一个base64编码器的修改版本和一种二进制XMLHTTP请求技术。脚本会下载PDF文件,然后使用base64编码器动态生成并放置一个数据URI链接。
当您需要八位字节流编码但无法访问服务器(似乎是OP的情况)时,这应该很有用。
请注意,我刚刚发布了一个示例,其中使用了hunts.pdf,这是OP正在测试的文件。
/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr2raw, chr3, chr3raw, enc1, enc2, enc3, enc4;
        var i = 0;

        //input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++) & 0xFF;
            chr2 = isNaN(chr2raw = input.charCodeAt(i++)) ? NaN : (chr2raw & 0xFF);
            chr3 = isNaN(chr3raw = input.charCodeAt(i++)) ? NaN : (chr3raw & 0xFF);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    }
}



// http://web.archive.org/web/20071103070418/mgran.blogspot.com/2006/08/downloading-binary-streams-with.html
//fetches BINARY FILES synchronously using XMLHttpRequest

load_url = function(url) {
    var req = new XMLHttpRequest();
    req.open('GET',url,false);
    //XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
    req.overrideMimeType('text/plain; charset=x-user-defined');
    req.send(null);

    if (req.status != 200){
    alert(req.status);
    return '';
    }
    return req.responseText;
}

    function getDataURI(filename)
    {
    var file =  load_url(filename);
    var uueFile = Base64.encode(file);
    var uri = 'data:application/octet-stream;base64,' + encodeURIComponent(uueFile);
    return uri;
    }

 window.addEventListener("load",
                      function()
                      {
                        var link = getDataURI("foo.pdf");
                        document.getElementById("myDiv").innerHTML += '<a href="' + link + '"><code>' + link +  '</code></a><br><br>';
                      }

@raj:这正是头部的作用。响应体是内容,头部是对如何处理它的建议(例如Content-Disposition)。 - Piskvor left the building
1
感谢您提供的解决方案。我尝试使用了这段代码。以下是我使用的代码底部:window.addEventListener("load", function() { var link = getDataURI("http://www.google.com/ads/hunts.pdf"); document.getElementById("myDiv").innerHTML += '<a href="' + link + '"><code>' + link + '</code></a><br><br>'; } </script><body> <div id="myDiv">hello</div> </body> </html> 不幸的是,除了单词“hello”之外,HTML文件上没有任何内容。没有PDF文件。我需要其他东西吗? - raj
首先,您只能在自己的服务器上进行XMLHttpRequest调用。因此,请将PDF复制到与HTML页面相同的服务器上,然后重试。如果仍然无法工作,请启用JavaScript错误检查,并告诉我们哪些错误。 - Matthew Flaschen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接