Javascript/jQuery を使用して画像をダウンロードする (ダウンロード ダイアログを開く) スクリプトを作成して、ブラウザが画像を表示しないようにする方法があるかどうかを知りたいです。
4 に答える
これには、サーバー側のスクリプトを使用する必要があります。stackoverflow で検索します。
または、サーバーで、構成を介してヘッダーを動的に変更できる場合があります。
mod_headers を使用した Apache ソリューション
ダウンロード可能なイメージをディレクトリに配置します。このディレクトリ内.htaccess
に、次の内容のファイルを作成します。
SetEnvIf Request_URI "([^/]+\.jpg)$" REQUESTED_IMAGE_BASENAME=$1
SetEnvIf Request_URI "([^/]+\.png)$" REQUESTED_IMAGE_BASENAME=$1
Header set Content-Disposition "attachment; filename=\"%{REQUESTED_IMAGE_BASENAME}e\"" env=REQUESTED_IMAGE_BASENAME
テスト リクエスト:
HEAD /test/Water%20lilies.jpg HTTP/1.1
Host: localhost
テスト応答:
HTTP/1.1 200 OK
Date: Sat, 23 Jul 2011 09:03:52 GMT
Server: Apache/2.2.17 (Win32)
Last-Modified: Thu, 23 Aug 2001 14:00:00 GMT
ETag: "26000000017df3-14752-38c32e813d800"
Accept-Ranges: bytes
Content-Length: 83794
Content-Disposition: attachment; filename="Water lilies.jpg"
Content-Type: image/jpeg
HTML5 ソリューション
アンカーで HTML5 属性を使用download
できます。
<p>Example 1<br>
<a href="http://dummyimage.com/600x400/000/fff.png" download>Download this image</a></p>
<p>Example 2<br>
<a href="http://dummyimage.com/600x400/000/fff.png" download="alternate-filename.png"><img
src="http://dummyimage.com/150x100/000/fff.png"></a></p>
次の制限付きで、画像のダウンロードを強制する純粋な JavaScript の方法を考え出しました。
- HTML5 を使用しているため、IE9 より前の IE ブラウザーではまったく機能しません。
- IE では (9 でも)、URL の長さの制限により、非常に小さな画像に制限されています。
- イメージ名 (マシンに保存されたとき) はコードでは判別できません。Chrome では、拡張子なしで「ダウンロード」され、Firefox では、「.part」拡張子が付いたジブリっぽい文字列のように見えます。いずれにしても、ユーザーは、ファイルを使用できるように名前を変更する必要があります。
- 同じドメイン内の画像のみをダウンロードできます - 同じオリジン ポリシー。
上記の制限 (特に 3 番目) により、多かれ少なかれこれは役に立たなくなりますが、それでも「コア」のアイデアは機能しており、うまくいけば、将来のある時点でファイル名を決定できるようになり、より便利になるでしょう。
コードは次のとおりです。
function DownloadImage(imageURL) {
var oImage = document.getElementById(imageURL);
var canvas = document.createElement("canvas");
document.body.appendChild(canvas);
if (typeof canvas.getContext == "undefined" || !canvas.getContext) {
alert("browser does not support this action, sorry");
return false;
}
try {
var context = canvas.getContext("2d");
var width = oImage.width;
var height = oImage.height;
canvas.width = width;
canvas.height = height;
canvas.style.width = width + "px";
canvas.style.height = height + "px";
context.drawImage(oImage, 0, 0, width, height);
var rawImageData = canvas.toDataURL("image/png;base64");
rawImageData = rawImageData.replace("image/png", "image/octet-stream");
document.location.href = rawImageData;
document.body.removeChild(canvas);
}
catch (err) {
document.body.removeChild(canvas);
alert("Sorry, can't download");
}
return true;
}
ご覧のとおり、トリックは画像をcanvas
オブジェクトに描画し、画像の生のバイナリ データを取得してから、image/octet-stream
MIME タイプを使用してブラウザの場所を変更することでダウンロードを強制することです。
使用例も以下に示します。
HTML:
<image id="myimage" src="Penguins.jpg" />
<button type="btnDownload" rel="myimage">Download</button>
JavaScript:
window.onload = function() {
var arrButtons = document.getElementsByTagName("button");
for (var i = 0; i < arrButtons.length; i++) {
var oButton = arrButtons[i];
var sRelatedImage = oButton.getAttribute("rel");
if (sRelatedImage && sRelatedImage.length > 0) {
oButton.onclick = function() {
HandleRelatedImage(this, sRelatedImage);
}
}
}
};
function HandleRelatedImage(oButton, sRelatedImage) {
var oImage = document.getElementById(sRelatedImage);
if (!oImage) {
alert("related image '" + sRelatedImage + "' does not exist");
return false;
}
return DownloadImage(sRelatedImage);
}
これにより、ボタンの属性をイメージ ID に割り当てることで、既存のすべてのイメージにダウンロード ボタンを「アタッチ」できますrel
。残りの作業はコードが行い、実際のクリック イベントをアタッチします。
同じオリジン ポリシーのため、jsFiddle でライブ サンプルを投稿できません。スクリプトの実行に「サンドボックス」ドメインを使用しています。
HTML5 の「ダウンロード」属性を使用する簡単なソリューションを次に示します。
document.getElementById('download').click();
<a id="download" href="https://docs.google.com/uc?id=0B0jH18Lft7ypSmRjdWg1c082Y2M" download hidden></a>
これは完全に可能です。画像をBase64としてエンコードしてwindow.open
から、data:image/jpg,Base64,...
スタイルのURLでを実行します。