ブラウザ/ HTMLsrc =“ data:image / jpeg; base64…”から画像を強制的にダウンロードします


85

クライアント側で画像を生成し、次のようにHTMLで表示します。

<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgM...."/>

生成された画像をダウンロードする可能性を提供したいと思います。

ブラウザがファイル保存ダイアログを開いている(またはchromeやfirefoxなどの画像をダウンロードフォルダにダウンロードする)ことをどのように認識できますか?ユーザーは右クリックして画像に名前を付けて保存することなく画像を保存できますか?

私はサーバーの相互作用のないソリューションを好みます。そのため、最初にイメージをアップロードしてからダウンロードを開始すると可能になることを認識しています。

どうもありがとう!

回答:


119

単純に置き換えるimage/jpegapplication/octet-stream。クライアントはURLをインライン化可能なリソースとして認識せず、ダウンロードダイアログを表示します。

単純なJavaScriptソリューションは次のようになります。

//var img = reference to image
var url = img.src.replace(/^data:image\/[^;]+/, 'data:application/octet-stream');
window.open(url);
// Or perhaps: location.href = url;
// Or even setting the location of an <iframe> element, 

別の方法は、blob:URIを使用することです。

var img = document.images[0];
img.onclick = function() {
    // atob to base64_decode the data-URI
    var image_data = atob(img.src.split(',')[1]);
    // Use typed arrays to convert the binary data to a Blob
    var arraybuffer = new ArrayBuffer(image_data.length);
    var view = new Uint8Array(arraybuffer);
    for (var i=0; i<image_data.length; i++) {
        view[i] = image_data.charCodeAt(i) & 0xff;
    }
    try {
        // This is the recommended method:
        var blob = new Blob([arraybuffer], {type: 'application/octet-stream'});
    } catch (e) {
        // The BlobBuilder API has been deprecated in favour of Blob, but older
        // browsers don't know about the Blob constructor
        // IE10 also supports BlobBuilder, but since the `Blob` constructor
        //  also works, there's no need to add `MSBlobBuilder`.
        var bb = new (window.WebKitBlobBuilder || window.MozBlobBuilder);
        bb.append(arraybuffer);
        var blob = bb.getBlob('application/octet-stream'); // <-- Here's the Blob
    }

    // Use the URL object to create a temporary URL
    var url = (window.webkitURL || window.URL).createObjectURL(blob);
    location.href = url; // <-- Download!
};

関連ドキュメント


1
何らかの理由でChrome19.0ベータ版では壊れているようですが、Chrome 18とFirefoxで動作するので、問題ありません。ファイル名を設定することはできますか?
アレックス2012年

data-URIにファイル名を設定する方法はありません。場合でもキャンバス/ブロブは、データをエクスポートするために使用され、ファイル名は設定できません。私の答えに別の方法を追加しました(これはChrome 19で機能すると思います)。
ロブW

2
最初の方法はChrome19で機能しなくなったため、非推奨になると思いますか?
アレックス2012年

1
関連する情報源が見つかりません。ちなみに、Chromeでデフォルトの名前を設定する方法を提案するこの回答も見つけました(アンカーのみ、ユーザーはそれをクリックする必要があります)
Rob W

また、この解決策を見つけました-今のところクロムだけのようです。ご協力ありがとうございました!
アレックス2012年

96

タグのダウンロード属性を使用できます...

<a href="data:image/jpeg;base64,/9j/4AAQSkZ..." download="filename.jpg"></a>

詳細:https//developer.mozilla.org/en/HTML/element/a#attr-download


1
画像ソースを動的に生成するときに、このソリューションをどのように使用できますか?ダウンロードボタンがあるということです。ユーザーがそれをクリックすると、計算を行い、base64イメージを生成します。どうすればダウンロードを強制できますか?
ミハイル

Chromeでは、この方法を使用してファイル名を設定することはできません。ダウンロードしたファイルの名前は、何があっても「ダウンロード」のままです。イメージを...:データを使用している場合にのみ発生
cmaduro

5
これは古い投稿ですが、W3SchoolsのWebサイトによると、「ダウンロード」属性はIE、Safari、Operavではサポートされていません。< 12w3schools.com/tags/tryit.asp?filename=tryhtml5_a_download2実際、IEで試しました。それは機能しません.... :(
Mirko Lugano

6
このコメントの時点では、download属性はまだSafariとIEをサポートしていません。
TheCarver 2015

1
base64の長さに制限があり、このアプローチを使用して大きな画像をダウンロードすることはできません。
KiranChenna19年

15

次のようにタグの子としてimgタグが必要だと思います。

<a download="YourFileName.jpeg" href="data:image/jpeg;base64,iVBO...CYII=">
    <img src="data:image/jpeg;base64,iVBO...CYII="></img>
</a>

または

<a download="YourFileName.jpeg" href="/path/to/OtherFile.jpg">
    <img src="/path/to/OtherFile.jpg"></img>
</a>

#15で説明されているタグを使用するだけでは FirefoxとChromeの最新バージョンでは機能しませんでしたがa.hrefタグとimg.srcタグの両方に同じ画像データを配置することは機能しました。

JavaScriptから、次のように生成できます。

var data = canvas.toDataURL("image/jpeg");

var img = document.createElement('img');
img.src = data;

var a = document.createElement('a');
a.setAttribute("download", "YourFileName.jpeg");
a.setAttribute("href", data);
a.appendChild(img);

var w = open();
w.document.title = 'Export Image';
w.document.body.innerHTML = 'Left-click on the image to save it.';
w.document.body.appendChild(a);

内部にimgタグが必要なわけではなく、MSDNのドキュメントには、ダウンロード済みのリソースのみを使用できると記載されています。同じdata:base64のイメージがどこにでもある限り、機能するはずです。msdn.microsoft.com/en-us/library/cc848897.aspx- 「セキュリティ上の理由から、データURIはダウンロードされたリソースに制限されています。データURIは、ナビゲーション、スクリプト作成、またはフレームまたはiframe要素の入力には使用できません。」
Dimitar Christoff 2017年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.