取消Chrome中的“另存为”对话框

时间:2013-01-11 20:34:59

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

如果我正在制作Chrome扩展程序,如果服务器强制“另存为...”对话框,如何在新标签页中打开图像?我可以看到,这是关于Content-Disposition标题属性的内容 有几十个关于如何强制浏览器打开该对话框的服务器端Q / A,但是我找不到任何东西,如何与最终用户作斗争,谁不想要那个对话窗口。

2 个答案:

答案 0 :(得分: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

添加此代码的网址,并检查是否仍然会抛出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"]);

答案 1 :(得分:0)

@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"]
);