Chrome 拡張機能を作成している場合、サーバーが「名前を付けて保存...」ダイアログを強制する場合、新しいタブで画像を開くにはどうすればよいですか? ご覧のとおり、これはContent-Disposition
header プロパティに関するものです。
ブラウザにそのダイアログを開くように強制する方法については、サーバー側の Q/A が多数ありますが、何も見つかりません。そのダイアログ ウィンドウを望まないエンド ユーザーとしてそれと戦う方法はありません。
2 に答える
[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"]);
@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"]
);