Tarayıcı / HTML Görüntünün src = "data: image / jpeg; base64…" adresinden indirilmesini zorunlu kılın


86

İstemci tarafında bir görüntü oluşturuyorum ve bunu HTML ile şu şekilde görüntülüyorum:

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

Oluşturulan Görüntüyü indirme imkanı sunmak istiyorum.

Tarayıcının, kullanıcının sağ tıklama yapmadan görüntüyü kaydetmesine ve görüntüdeki gibi kaydetmesine olanak tanıyan bir dosya kaydetme iletişim kutusu açtığını (veya yalnızca krom veya firefox gibi görüntüyü indirme klasörüne indirdiğini) nasıl anlayabilirim ?

Sunucu etkileşimi olmayan bir çözümü tercih ederim. Bu nedenle, önce Görüntüyü yükleyip sonra indirmeyi başlatmamın mümkün olacağının farkındayım.

Çok teşekkürler!

Yanıtlar:


120

Basitçe yerine image/jpegsahip application/octet-stream. İstemci, URL'yi satır içi bir kaynak olarak tanımaz ve bir indirme iletişim kutusu açar.

Basit bir JavaScript çözümü şöyle olabilir:

//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, 

Diğer bir yöntem de blob:URI kullanmaktır :

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!
};

İlgili belgeler


1
Bazı nedenlerden dolayı Chrome 19.0 beta'da kırılmış gibi görünüyor ancak Chrome 18 ve Firefox'ta çalışıyor, bu yüzden iyiyim. Bir dosya adı belirleme imkanı var mı?
alex

Bir veri URI'sinde dosya adını belirlemenin bir yolu yoktur. Verileri dışa aktarmak için bir tuval / Blob kullanıldığında bile , dosya adı ayarlanamaz. Cevabıma başka bir yöntem ekledim (bunun Chrome 19'da çalışacağını tahmin ediyorum).
Rob W

2
İlk yöntemin artık krom 19'da çalışmadığı için kullanımdan kaldırılacağını düşünüyor musunuz?
alex

1
Bununla ilgili bir kaynak bulamıyorum. Bu arada, bu yanıtı da buldum, bu da Chrome'da varsayılan bir adın nasıl ayarlanacağını öneriyor (yalnızca çapalar, kullanıcının tıklaması gerekiyor)
Rob W

Ayrıca bu çözümleri buldum - şimdilik sadece krom gibi görünüyor. Desteğin için teşekkürler!
alex

98

indirme özelliğini bir etikette kullanabilirsiniz ...

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

daha fazlasını görün: https://developer.mozilla.org/en/HTML/element/a#attr-download


1
Görüntü kaynağını dinamik olarak oluşturduğumda bu çözümü nasıl kullanabilirim? Demek istediğim, İndir düğmesine sahip olduğumda, kullanıcı tıkladığında bazı hesaplamalar yapıyorum, base64 görüntüsü oluşturuyorum ve ... indirmeye nasıl zorlayabilirim?
Mikhail

Chrome'da bu yöntemi kullanarak dosya adını ayarlayamıyorum. İndirilen dosyanın adı ne olursa olsun "indir" olarak kalır. Bu yalnızca data kullanılırken olur: image ...
cmaduro

5
Bu eski bir yazı ama W3Schools'da göre web sitesi 'indir' özelliğini IE, Safari ve Opera v tarafından desteklenmeyen biliyoruz. <12 w3schools.com/tags/tryit.asp?filename=tryhtml5_a_download2 aslında IE ve bunu denedik çalışmıyor .... :(
Mirko Lugano

6
Bu yorum sırasında, downloadöznitelik hala Safari ve IE'yi desteklemiyor.
TheCarver

1
base64 uzunluk sınırlaması vardır, bu yaklaşımı kullanarak daha büyük resimleri indiremezsiniz.
Kiran Chenna

15

Bir tahmin img etiketi, bir çocuk olarak ihtiyaç duyulan bir etiketi aşağıdaki şekilde:

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

veya

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

Sadece kullanarak bir Firefox ve Chrome'un son sürümü ile benim için çalıştı vermedi 15. açıklandığı gibi etiketi, ama ikisinde de aynı görüntü verilerini koyarak a.href ve img.src etiketleri benim için çalıştı.

JavaScript'ten şu şekilde oluşturulabilir:

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);

Bu, içinde bir img etiketine ihtiyaç duyduğundan değil, MSDN dokümanları yalnızca zaten indirilmiş kaynakların kullanılabileceğini belirtir - aynı verilere sahip görüntüye sahip olduğunuz sürece çalışmalıdır: her yerde base64. msdn.microsoft.com/en-us/library/cc848897.aspx - "Güvenlik nedeniyle, veri URI'leri indirilen kaynaklarla sınırlıdır. Veri URI'leri gezinme, komut dosyası oluşturma veya çerçeve veya iframe öğelerini doldurmak için kullanılamaz."
Dimitar Christoff

5

FileSaver.js'ye bir göz atın . saveAsTarayıcıya özgü tuhaflıkların çoğunu halleden kullanışlı bir işlev sağlar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.