【问题标题】:Supress the Save as dialog in Chrome禁止 Chrome 中的“另存为”对话框
【发布时间】:2012-12-26 12:15:04
【问题描述】:

如果我正在制作 Chrome 扩展程序,如果服务器强制“另存为...”对话框,我如何在新选项卡中打开图像?如我所见,这与 Content-Disposition 标头属性有关。
关于如何强制浏览器打开该对话框有几十个服务器端 Q/A,但我什么也找不到,作为最终用户如何与之抗争,谁不想要那个对话框窗口。

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension content-disposition


    【解决方案1】:

    [RFC 822] 的扩展 BNF 表示法中,Content-Disposition 头域定义如下:

        disposition := "Content-Disposition" ":"
                       disposition-type
                       *(";" disposition-parm)
    
        disposition-type := "inline"
                          / "attachment"
                          / extension-token
                          ; values are not case-sensitive
    
        disposition-parm := filename-parm / parameter
    
        filename-parm := "filename" "=" value;
    

    如果忽略处置参数,它只会执行以下操作。

    "content-disposition","attachment; filename=fname.jpeg" 每次提供 jpeg 文件时下载它。

    "content-disposition","inline; filename=fname.jpeg" 显示 jpeg 文件,而不是在提供时下载 jpeg 文件。

    此行为取决于浏览器和您尝试提供的文件。

    例如,如果您有一个 JPEG 文件,则内联 disposition-type 将在浏览器中打开图像,而附件将强制下载。

    如果您使用的是 .ZIP 文件,浏览器将无法内联显示它,因此对于内联和附件 disposition-type,将下载该文件。

    你必须使用WebRequest API,来修改你的标题

    示例代码

    chrome.webRequest.onBeforeSendHeaders.addListener(
    
    function (details) {//Modify Headers
        details.requestHeaders.push({
            "name": "content-disposition",
            "value": "inline; filename=`_some_filename.some_extension`"
        });
        return {//Update Headers
            requestHeaders: details.requestHeaders
        };
    }, {
        urls: ["<all_urls>"]
    }, ["blocking", "requestHeaders"]);//Block the requests
    

    请务必声明

    "permissions": [
        "webRequest",
        "webRequestBlocking"
      ]
     
    

    在您的清单文件中

    参考文献

    编辑 1

    添加此代码的 URL 并检查它是否仍会引发 save as 对话框。

    chrome.webRequest.onHeadersReceived.addListener(
    
    function (details) {
    
        var _content_to_append = {
            "name": "content-disposition",
            "value": "inline"
        };
        details.responseHeaders.push(_content_to_append);
        return {
            responseHeaders: details.responseHeaders
        };
    }, {
        urls: ["<all_urls>"]
    }, ["blocking", "responseHeaders"]);
    

    【讨论】:

    • 感谢您提供如此详细的答案,但我无法使其工作。以下是来自 background.js pastebin.com/raw.php?i=rQNrvLYp 和记录对象的示例问题图像 url、当前权限和侦听器:lh6.googleusercontent.com/-3jxp4W0IZhw/UPLya8PgF_I/AAAAAAAAGdA/… 它仍然会打开对话框。
    • @Nakilon: 你能分享你的响应头吗,只是想确保你的服务器没有忽略任何请求头。
    • 如何查看响应标头?开发工具只显示 url、'GET' 和 200。
    • @Nakilon:打开Network panel并点击request查找标头选项卡,其中列出了请求和响应标头。
    • 成功了! 1. 无需覆盖 sendheaders 2. 标题应就地编辑,而不是推送。所以这是最终的解决方案:pastebin.com/raw.php?i=wY7u1zLt
    【解决方案2】:

    @Sudarshan 给出了正确的方向。

    但它出现在另一个网站上,即使Content-Disposition 也不够。
    所以我目前的工作代码是:

    chrome.webRequest.onHeadersReceived.addListener(
        function (details) {
            for (var i in details.responseHeaders) {
                if (details.responseHeaders[i].name == "Content-Disposition")
                    details.responseHeaders[i].value = "inline; filename=\"\"";
                if (details.responseHeaders[i].name == "Content-Type")
                    details.responseHeaders[i].value = "image/jpeg";
            };
            return { responseHeaders: details.responseHeaders };
        }, {
            urls: [
                "http://qwe.rty.net/*",
                "http://*.qwerty.com/*",
            ]
        }, ["blocking", "responseHeaders"]
    );
    

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 2012-08-22
      • 2011-10-28
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多