Veri url dosyasını indirin


127

Herkesin bir tarayıcıdan erişebileceği tamamen JavaScript tabanlı bir zip / unzip yardımcı programı yapma fikrini oynuyorum. Zip'lerini doğrudan tarayıcıya sürükleyebilirler ve bu, içindeki tüm dosyaları indirmelerine izin verir. Ayrı ayrı dosyaları sürükleyerek yeni zip dosyaları da oluşturabilirler.

Bunu sunucu tarafında yapmanın daha iyi olacağını biliyorum ama bu proje sadece biraz eğlence amaçlı.

Mevcut çeşitli yöntemlerden yararlanırsam, dosyaları tarayıcıya sürüklemek yeterince kolay olacaktır. (Gmail stili)

Kodlama / kod çözme umarım iyi olur. Bazı as3 zip kitaplıkları gördüm, bu yüzden bu konuda sorun olmayacağından eminim.

Sorunum, dosyaların sonunda indirilmesidir.

window.location = 'data:jpg/image;base64,/9j/4AAQSkZJR....' 

bu, firefox'ta iyi çalışır, ancak chrome'da çalışmaz.

Dosyaları kullanarak Chrome'da gayet iyi görüntüler olarak yerleştirebilirim <img src="data:jpg/image;ba.." /> , ancak dosyalar mutlaka resim olmayacak. Herhangi bir format olabilirler.

Başka bir çözüm veya bir tür geçici çözüm düşünebilen var mı?


Şu anki destek maalesef oldukça sınırlı
Casebash

Yanıtlar:


42

fikirler:

  • <a href="data:...." target="_blank">(Test edilmemiş) deneyin

  • Kullan downloadify (aynı zamanda IE için çalışacak) yerine veri URL'lerin


@jcubic, ölü bağlantıyı işaret ettiğiniz için teşekkürler. Yeni indirme konumu github.com/dcneiner/Downloadify
Pekka

Flash kullanamıyorsanız, ancak bir Java sunucu tarafı bileşeni çalıştırıyorsanız, bunu kullanabilirsiniz: github.com/suprememoocow/databounce . Verileri istemciden 'geri döndürmek' için bir Servlet kullanır. Aynı numarayı Python, ASP.NET vb. Gibi diğer sunucu tarafı teknolojilerinde de gerçekleştirmek oldukça kolay olurdu
Andrew Newdigate

Flaşsız yapmanın bir yolu var mı? IE ve IE için bir tür ActiveX foo hariç tüm tarayıcılar için veri URL'si? (Bu şekilde flaşsız müzik çalmayı başardım: IE için IE ve ActiveX hariç tüm tarayıcılar için HTML5 ses.)
panzi

Downloadify, tarayıcıda flash player olmasını bekliyor. Kullanıcının flash oynatıcısı yoksa, dosya indirilmez
Jeevanandan J

187

Ayrıca dosyaya önerilen bir ad vermek istiyorsanız (varsayılan 'indirme' yerine) aşağıdakileri Chrome, Firefox ve bazı IE sürümlerinde kullanabilirsiniz:

function downloadURI(uri, name) {
  var link = document.createElement("a");
  link.download = name;
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  delete link;
}

Ve aşağıdaki örnek, bunun kullanıldığını gösterir:

downloadURI("data:text/html,HelloWorld!", "helloWorld.txt");

6
-İşlevinizlink.click() yerine bunu basitleştirebilirsiniz eventFire... jsfiddle.net/ARTsinn/Ezx5m
yckart

3
Güzel çözüm. ama bağlantı sonra ne olur?
webshaker

6
'Link' değişkeni, işlevin sonunda kapsamın dışına çıkar (bunu dom'a hiç eklemediğimize dikkat edin), bu nedenle kısa süre sonra çöp toplanacaktır.
owencm

8
Bu yalnızca Chrome'da çalışır. Firefox / IE'de çalışmasını istiyorsanız @MartinoDino'daki cevaba bakın.
TrueWill

1
Burada önerildiği gibi download.js ile denedim ve çalışıyor gibi görünüyor. :)
joaorodr84

56

function download(dataurl, filename) {
  var a = document.createElement("a");
  a.href = dataurl;
  a.setAttribute("download", filename);
  a.click();
}

download("data:text/html,HelloWorld!", "helloWorld.txt");

veya:

function download(url, filename) {
fetch(url).then(function(t) {
    return t.blob().then((b)=>{
        var a = document.createElement("a");
        a.href = URL.createObjectURL(b);
        a.setAttribute("download", filename);
        a.click();
    }
    );
});
}

download("https://get.geojs.io/v1/ip/geo.json","geoip.json")
download("data:text/html,HelloWorld!", "helloWorld.txt");


Varolmayan öğe üzerindeki tıklama olayı: D appendchild gerek yok.
Zibri

1
Evet. 'a' öğesini oluşturduktan sonra a.click () öğesini çağırabilir ve ardından a'nın href değerini ayarlayabilirsiniz.
user1709076

geçmişte a.click () 'i doğrudan çağırmak işe yaramazdı, ancak olayla birlikte çalışır. Şimdi ikisi de çalışıyor.
Zibri

1
Bu, çoğu modern tarayıcıda çalışır, ancak bazı eski tarayıcıları desteklemek için belgeye eklemenin ve ardından kaldırmanın gerekli olduğunu unutmayın.
owencm

3
DataUri çok büyüdüğünde ikinci çözümünüz kullanılmalıdır (tarayıcıya bağlıdır, ancak Chrome, benim deneyimime göre birden fazla megabaytlık Uri kabul etmemektedir). Ayrıca stackoverflow.com/questions/38781968/… konusuna bakın .
neural5torm

27

Deneyimlerimi paylaşmak ve Firefox'ta çalışmayan indirmelerde takılıp kalan birine yardım etmek ve 2014'e verilen yanıtı güncellemek istiyorum. Aşağıdaki ön bilgi hem firefox hem de chrome'da çalışacak ve bir dosya adını kabul edecek:

  // Construct the <a> element
  var link = document.createElement("a");
  link.download = thefilename;
  // Construct the uri
  var uri = 'data:text/csv;charset=utf-8;base64,' + someb64data
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  // Cleanup the DOM
  document.body.removeChild(link);

4
Ne yazık ki, Safari'de çalışmıyor. Safari, downloadözniteliği tanımıyor gibi görünüyor . Her neyse, teşekkürler, şu anda olabildiğince yakın.
Moritz Petersen

bu, pencerenin IE 11'de benim için href değerine yönlendirilmesine neden oluyor. prevetDefault ();
IE'deki

1
Teşekkürler, btoatanımlanmadıysa da (örn. Düğüm eslinted ön uç projesinde) const btxt = new Buffer(text).toString('base64'); const uri = 'data:text/csv;charset=utf-8;base64,' + btxt + ';'
Ivan Borshchov

2
Bağlantının silinmesi anlamsızdır, bir sonraki satırda kapsam dışına çıkar ve çöp olarak toplanır, silmek için geçerli bir hedef değildir.
macdja38

1
document.body.appendChild'e gerek yok ...
cevabıma

13

İşte Firefox ve Chrome'da test ettiğim ancak Internet Explorer'da test etmediğim saf bir JavaScript çözümü:

function downloadDataUrlFromJavascript(filename, dataUrl) {

    // Construct the 'a' element
    var link = document.createElement("a");
    link.download = filename;
    link.target = "_blank";

    // Construct the URI
    link.href = dataUrl;
    document.body.appendChild(link);
    link.click();

    // Cleanup the DOM
    document.body.removeChild(link);
    delete link;
}

Şimdiye kadar bulunan tarayıcılar arası çözümler:

downloadify -> Flash gerektirir

databounce -> IE 10 ve 11'de test edildi ve benim için çalışmıyor. Sunucu uygulaması ve bazı özelleştirme gerektirir. (Gezgini yanlış algıladı. Test etmek için IE'yi uyumluluk moduna, sunucu uygulamasında varsayılan karakter kümesine, mutlak yollar için doğru sunucu uygulamacığı yoluna sahip JavaScript seçenekleri nesnesine ayarlamam gerekiyordu ...) IE olmayan tarayıcılar için, dosyayı aynı pencerede açar.

download.js -> http://danml.com/download.html Benzer ancak test edilmemiş başka bir kitaplık. Saf JavaScript olduğunu iddia eder, sunucu uygulaması veya Flash gerektirmez, ancak IE <= 9 üzerinde çalışmaz.


download.js oldukça iyidir. Sadece IE11 üzerinde hızlı bir kontrol yaptım, işe yarıyor. Çok teşekkürler!
Ricky Jiao

12

Birkaç çözüm var ancak bunlar HTML5'e bağlı ve henüz bazı tarayıcılarda tam olarak uygulanmadı. Aşağıdaki örnekler Chrome ve Firefox'ta test edilmiştir (kısmen çalışır).

  1. Dosyaya kaydetme desteğiyle tuval örneği . document.location.hrefVeri URI'sini ayarlamanız yeterlidir.
  2. Çapa indirme örneği . <a href="your-data-uri" download="filename.txt">Dosya adını belirtmek için kullanır .

3
tuval örneği 404'e yol açar
Karel Bílek

İndirme özelliği, krom ve mobil safaride bir pdf veri url'si için benim için çalışıyor.
bbsimonbb

7

@Owencm ve @ Chazt3n'den gelen yanıtları birleştiren bu işlev, metinlerin IE11, Firefox ve Chrome'dan indirilmesine izin verir. (Üzgünüm, Safari veya Opera'ya erişimim yok, ancak denerseniz ve çalışırsa lütfen bir yorum ekleyin.)

initiate_user_download = function(file_name, mime_type, text) {
    // Anything but IE works here
    if (undefined === window.navigator.msSaveOrOpenBlob) {
        var e = document.createElement('a');
        var href = 'data:' + mime_type + ';charset=utf-8,' + encodeURIComponent(text);
        e.setAttribute('href', href);
        e.setAttribute('download', file_name);
        document.body.appendChild(e);
        e.click();
        document.body.removeChild(e);
    }
    // IE-specific code
    else {
        var charCodeArr = new Array(text.length);
        for (var i = 0; i < text.length; ++i) {
            var charCode = text.charCodeAt(i);
            charCodeArr[i] = charCode;
        }
        var blob = new Blob([new Uint8Array(charCodeArr)], {type: mime_type});
        window.navigator.msSaveOrOpenBlob(blob, file_name);
    }
}

// Example:
initiate_user_download('data.csv', 'text/csv', 'Sample,Data,Here\n1,2,3\n');

1

IE'de sorunları olan herkes için:

Lütfen Yeti tarafından yazılan yanıtı destekleyin: tuvali IE'de yerel olarak kaydetme

dataURItoBlob = function(dataURI) {
    var binary = atob(dataURI.split(',')[1]);
    var array = [];
    for(var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    return new Blob([new Uint8Array(array)], {type: 'image/png'});
}

var blob = dataURItoBlob(uri);
window.navigator.msSaveOrOpenBlob(blob, "my-image.png");

0

Sorununuz esasen "tüm tarayıcılar bunu desteklemeyecek" şeklinde özetlenebilir.

Bir geçici çözüm deneyebilir ve sıkıştırılmış dosyaları bir Flash nesnesinden sunabilirsiniz, ancak daha sonra yalnızca JS saflığını kaybedersiniz (yine de, şu anda bir tür Flash geçici çözümü olmadan "dosyaları tarayıcıya sürükleyip sürükleyemeyeceğinizden" emin değilim - bu bir HTML5 özelliği olabilir mi?)

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.