Dosya oluşturmak ve kaydetmek için HTML5 / JavaScript kullanma


317

Son zamanlarda WebGL ile uğraşıyordum ve bir Collada okuyucusunun çalışmasını sağladım. Sorun oldukça yavaş (Collada çok ayrıntılı bir formattır), bu yüzden dosyaları kullanımı daha kolay bir formata dönüştürmeye başlayacağım (muhtemelen JSON). Zaten JavaScript dosya ayrıştırma kodu var, bu yüzden de benim ihracatçı olarak da kullanabilirsiniz! Sorun kaydediyor.

Şimdi, dosyayı ayrıştırabildiğimi, sonucu sunucuya gönderebileceğimi ve tarayıcının dosyayı sunucudan karşıdan yükleme olarak istemesini sağlayabildiğimi biliyorum. Ancak gerçekte sunucunun bu özel işlemle ilgisi yoktur, o zaman neden bu işe karışsın? Zaten bellekte istenen dosyanın içeriği var. Ben kullanıcıya saf JavaScript kullanarak bir indirme sunmak için herhangi bir yolu var mı? (Bundan şüphe ediyorum, ama sorabilir de ...)

Ve net olmak gerekirse: Kullanıcıların bilgisi olmadan dosya sistemine erişmeye çalışmıyorum! Kullanıcı bir dosya sağlayacaktır (muhtemelen sürükle ve bırak yöntemiyle), komut dosyası dosyayı hafızaya dönüştürür ve kullanıcıdan sonucu indirmesi istenir. Bunların tümü, tarayıcı açısından "güvenli" etkinlikler olmalıdır.

[EDIT]: Açıkça bahsetmedim, bu yüzden "Flash" yanıtlayan posterler yeterince geçerli, ama yaptığım şeyin bir kısmı saf HTML5 ile neler yapılabileceğini vurgulama girişimidir ... bu yüzden Flash tam da benim durumumda. (Gerçi "gerçek" bir web uygulaması yapan herkes için mükemmel geçerli bir cevap olsa da.) Bu durumda sunucuyu dahil etmek istemiyorum sürece ben şanssız gibi görünüyor. Yine de teşekkürler!


8
Kabul edilen cevabı değiştirmeyi düşünebilirsiniz, şimdi tamamen HTML bir yol var gibi görünüyor
Pekka

Yanıtlar:


256

Tamam, bir veri oluşturma: Matthew ve Dennkster bu seçeneği işaret ettiği için URI benim için kesinlikle hile yapıyor! Temelde nasıl yaparım:

1) tüm içeriği "içerik" adlı bir dizeye alın (örneğin başlangıçta orada oluşturarak veya önceden oluşturulmuş bir sayfanın etiketinin innerHTML'sini okuyarak).

2) Veri URI'sini oluşturun:

uriContent = "data:application/octet-stream," + encodeURIComponent(content);

Tarayıcı türüne vb. Bağlı olarak uzunluk sınırlamaları olacaktır, ancak örneğin Firefox 3.6.12 en az 256k'ye kadar çalışır. Base64'te kodlamak yerine encodeURIComponent kullanmak işleri daha verimli hale getirebilir, ama benim için sorun değil.

3) yeni bir pencere açın ve bu URI'ye "yeniden yönlendirin", JavaScript tarafından oluşturulan sayfamın indirme konumunu ister:

newWindow = window.open(uriContent, 'neuesDokument');

Bu kadar.


34
Engellenebilecek bir açılır pencere kullanmaktan kaçınmak istiyorsanız location.href, içeriği olarak ayarlayabilirsiniz . location.href = uriContent.
Alex Turpin

12
Merhaba bunu denedim ama dosyayı .part dosyası olarak indirir. Dosya türünü nasıl ayarlayabilirim?
Sedat Başar

6
@ SedatBaşar Veri URI'leri bir dosya adı ayarlamayı desteklemez, tarayıcıya mime türünü kullanarak uygun bir uzantı ayarlamanız gerekir. Ancak mime türü tarayıcı tarafından oluşturulabilirse, indirmez, ancak görüntüler. Bunu yapmanın başka yolları da vardır, ancak ikisi de IE <10'da çalışmaz.
panzi

7
IE gerçekten veri URI'leri sopport ve Firefox rastgele bir ad ile dosyaları kaydetmek gibi görünüyor.
nylund

25
Bence bunu olması gerekenden daha zor hale getiriyoruz. Bu sayfada JS konsolunuzu açın ve koyun location.href = "data:application/octet-stream," + encodeURIComponent(jQuery('#answer-4551467 .post-text').first().text());, @ Nøk'in bir dosyaya verdiği yanıtın içeriğini kaydedecektir. Test etmek için IE yok, ama webkit için çalışıyor.
Bruno Bronosky

278

HTML5'e hazır tarayıcılar için basit çözüm ...

function download(filename, text) {
    var pom = document.createElement('a');
    pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    pom.setAttribute('download', filename);

    if (document.createEvent) {
        var event = document.createEvent('MouseEvents');
        event.initEvent('click', true, true);
        pom.dispatchEvent(event);
    }
    else {
        pom.click();
    }
}

kullanım

download('test.txt', 'Hello world!');

2
İndirmek istediğiniz kaynak url'yi biliyorsanız, bu en iyi çözümdür!
sidonaldson

31
Dosya adını belirleme yeteneği bunu bir kazanan yapar.
Omn

9
Bu yöntem, birkaç gün önce (35.0.1916.114 m) aldığım en son güncellemeye kadar Chrome'da çalıştı. Şimdi kısmen dosya adı ve uzantı artık çalışmadığı için çalışır (ne olursa olsun her zaman download.txt adını verir.)
Sevin7

6
Chrom 42.0.2311.90'ım var ve bu benim için beklenen dosya adıyla çalışıyor.
Saurabh Kumar

4
Eklenebilecek veri miktarında bir sınır varsa?
Kaspar Lee

80

HTML5 bir window.saveAs(blob, filename)yöntem tanımladı . Şu anda hiçbir tarayıcı tarafından desteklenmiyor. Ancak , çoğu modern tarayıcıya (Internet Explorer 10+ dahil) bu işlevi ekleyen FileSaver.js adlı bir uyumluluk kütüphanesi vardır . Internet Explorer 10, Internet Explorer desteği için FileSaver.js'de kullanılan bir navigator.msSaveBlob(blob, filename)yöntemi ( MSDN ) destekler.

Bu sorunla ilgili daha fazla ayrıntı içeren bir blog yazısı yazdım .


1
Pop-up'ları engellemeye ne dersiniz? Bu kütüphanenin davranışı @ Nøk'un çözümü ile benzerdir. Firefox'ta düz metin yeni olarak açılır. Yalnızca Chrome kaydetmeye çalışır, ancak uzantıyı değiştirir (uzantısız bir nokta dosyasına ihtiyacım var).
ciembor

1
@ciembor (chrome ile kullandığım) (nesne url +) indirme öznitelik değişkeni bir dosya adı ayarlamanızı sağlar. Benim için kromda çalışıyor.
panzi

1
@ ciembor aha ve açılır pencere doğrudan tıklamaya neden olursa engellenmez.
panzi

6
FileSaver.js IE'yi şimdi destekliyor
Eli Gray

15
W3C diyor ki: Bu belge üzerindeki çalışmalar durduruldu ve başvuru için bir referans olarak kullanılmamalı veya kullanılmamalıdır.
WaiKit Kung

48

Büyük dosyaları kaydetme

Uzun veri URI'leri tarayıcılarda performans sorunları verebilir. İstemci tarafında oluşturulan dosyaları kaydetmenin başka bir seçeneği de içeriğini bir Blob (veya Dosya) nesnesine koymak ve kullanarak bir indirme bağlantısı oluşturmaktır URL.createObjectURL(blob). Bu, blobun içeriğini almak için kullanılabilecek bir URL döndürür. Blob, URL.revokeObjectURL()URL'de çağrılana veya onu oluşturan belge kapatılıncaya kadar tarayıcının içinde saklanır . Çoğu web tarayıcısının nesne URL'leri desteği vardır , Opera Mini bunları desteklemeyen tek kişidir.

İndirme zorlama

Veriler metin veya resim ise, tarayıcı dosyayı diske kaydetmek yerine açabilir. Bağlantıyı tıkladıktan sonra dosyanın indirilmesine neden olmak için downloadözniteliği kullanabilirsiniz . Ancak, tüm web tarayıcılarının indirme özelliği için desteği yoktur . Başka bir seçenek, application/octet-streamdosyanın mime türü olarak kullanmaktır, ancak bu, dosyanın bir dosya adı belirtmezseniz veya belirleyemezseniz, özellikle ikili bir blob olarak sunulmasına neden olur. Ayrıca bkz. ' Farklı Kaydet ...' açılır penceresini aç '.

Bir dosya adı belirtme

Blob Dosya oluşturucu ile oluşturulmuşsa, bir dosya adı da ayarlayabilirsiniz, ancak yalnızca birkaç web tarayıcısının (Chrome ve Firefox dahil) Dosya oluşturucu için desteği vardır . Dosya adı, downloadözniteliğin bağımsız değişkeni olarak da belirtilebilir , ancak bu bir dizi güvenlik konusuna tabidir . Internet Explorer 10 ve 11 kendi yöntemini sağlar, msSaveBlob bir dosya adı belirtmek için .

Örnek kod

var file;
var data = [];
data.push("This is a test\n");
data.push("Of creating a file\n");
data.push("In a browser\n");
var properties = {type: 'text/plain'}; // Specify the file's mime-type.
try {
  // Specify the filename using the File constructor, but ...
  file = new File(data, "file.txt", properties);
} catch (e) {
  // ... fall back to the Blob constructor if that isn't supported.
  file = new Blob(data, properties);
}
var url = URL.createObjectURL(file);
document.getElementById('link').href = url;
<a id="link" target="_blank" download="file.txt">Download</a>


1
Dosyayı kaydetmek için bir klasör (dizin) belirtmek üzere bir iletişim kutusu (açılır pencere) gösterebilir miyim?
Calvin

@Calvin: Bir indirmeyi nasıl zorlayacağınızı ve dosya adını nasıl sağlayacağınızı açıklamak için cevabı güncelledim. IE için, msSaveBlob"Farklı kaydet" iletişim kutusunu açmak için kullanabileceğinize inanıyorum . Diğer tarayıcılar için tek seçeneğiniz, indirme bağlantısının içerik menüsünden manuel olarak "Farklı kaydet" i seçmektir.
bcmpinc

1
@ Jek-fdrv: Safari'de yalnızca Blob URL'leri çalışır. İndirme özniteliği ve Dosya yapıcısı Safari tarafından desteklenmez, bu yüzden indirmeyi zorlayamazsınız, yani blob muhtemelen tarayıcının kendisinde açılır ve bir dosya adı belirtemezsiniz. Verilen örnek için, yine de bağlantının bağlam menüsünü kullanarak dosyayı Safari ile indirebilmeniz gerekir.
bcmpinc


Bu çok yardımcı ve bilgilendirici bir cevaptır. Benim gibi insanlara yardımcı olabilecek bir şey daha var: ayarladıktan sonra document.getElementById('link').href = url;, kodunuz devam edebilir ve öğenin .click()yöntemini kullanarak bağlantıyı tetikleyebilir.
LarsH

36
function download(content, filename, contentType)
{
    if(!contentType) contentType = 'application/octet-stream';
        var a = document.createElement('a');
        var blob = new Blob([content], {'type':contentType});
        a.href = window.URL.createObjectURL(blob);
        a.download = filename;
        a.click();
}

3
ContentType'ın etkisi nedir? Ne için kullanılır?
Uri

3
Bu, Matěj Pokorný'nın cevabından farklı olarak, en son Chrome'da bile iyi çalışıyor. Teşekkürler.
Alexander Amelkin

2
Bu benim için FF36 veya IE11'de işe yaramıyor. Matěj Pokorný'nın önerdiği gibi a.clickkodla değiştirirsem document.createEvent(), FF'de çalışır, ancak IE'de çalışmaz. Chrome'u denemedim.
Peter Hull

25

Bunu yapmak için Flash tabanlı bir JavaScript arayüzü olan Doug Neiner'ın Downloadify'ına bir göz atın .

Downloadify, tarayıcıda sunucu etkileşimi olmadan dosyaların anında oluşturulmasını ve kaydedilmesini sağlayan küçük bir JavaScript + Flash kütüphanesidir.


6
Çoğu insan için, bu muhtemelen ihtiyaç duyacakları cevaptır. Bu yüzden (yukarıda açıklandığı gibi) özel gereksinimlerimi karşılamasa da kabul edilen cevap olarak işaretliyorum.
Toji

2
@ Toji ah, anlıyorum. Belki de HTML 5afiş ve etiket altında yeniden sormak ve yeniden ifade ? Bu belirli bir alan hakkında bilen kullanıcıları çekmesi muhtemeldir (sanırım hala nispeten küçük bir kalabalık). HTML 5'te yapılabileceğinden eminim ama nasıl yapacağımı bilmiyorum.
Pekka

1
Has downloadify.info Downloadify alanı / satın transfer ve eğer öyleyse yeni bir konum var olmuştur? Mevcut site verilen cevapla tamamen ilgisiz görünüyor.
Christos Hayward

17
Bu HTML5 Kullanımı ... başlıklı soruyu yanıtlamaz.
Ixx

5
@Ixx adil olmak için, bu cevap gönderildikten sonra eklendi. Yine de haklısın. Aşağıdaki cevap kabul edilmelidir
Pekka

17

Basit Çözüm!

<a download="My-FileName.txt" href="data:application/octet-stream,HELLO-WORLDDDDDDDD">Click here</a>

Tüm Modern tarayıcılarda çalışır.


Merhaba, window.open veya başka bir javascript işlevini kullanarak "download" öznitelik davranışını nasıl belirleyeceğinizi biliyor musunuz?
yucer

2
@yucer ile indirme özelliği (veya bu konu için herhangi bir özellik) yok window.open(). Alakasız. Bu yöntemi kullanabilir ve üzerine zorlayabilirsiniz .click(), ancak .click()öğenin gövdeye eklenmesine izin vermeden önce aradığınızda Firefox'un beğenmediği için zamanlamayı izleyin .
Brad

Ancak ne yazık ki tüm alanlar siliniyor. Benim durumumda bir SVG dosyası için kaynak kodu indirmek istiyorum çünkü bu gerçekten kötü.
frankenapps

encodeURIComponent (content) kullanıyorsanız boşluklar korunur
Mike Redrobe

firefox'ta adı
seçemiyorum

10

Bir veri URI'si oluşturabilirsiniz . Ancak, tarayıcıya özgü sınırlamalar vardır.


1
Bu ilginç. Bir şans bulduğumda daha çok ilgileneceğim. Teşekkürler!
Toji

@quantumpotato, aslında URL oluşturmak açıklamak biraz zor. Tüm cesur cesur RFC 2397'de . Sen gibi araçlar kullanabilirsiniz bu test için. Ardından, gerçek uygulamanız için, diliniz için bir veri URI'si veya temel 64 kitaplığı arayabilirsiniz. Eğer bulamazsanız, takip sorusu sormaktan çekinmeyin. Tarayıcıya özgü bazı sınırlamalar Wikipedia makalesinde verilmiştir . Örneğin, IE uzunluk ve türü sınırlar (örneğin, text / html değil).
Matthew Flaschen

Veri URL'leri oluşturmak o kadar da zor değildir: "data:text/plain;charset=UTF-8,"+encodeURIComponent(text)Ancak evet, IE veri URL'lerinin boyutunu kullanılamaz bir miktarla sınırlar ve bunları window.open(...)veya iframe'ler için desteklemez (sanırım).
panzi

@panzi, o kadar kolay değil. Birincisi, bu Collada veya JSON için doğru MIME türü değil.
Matthew Flaschen

bilgilendirici olmayan cevap. lütfen, bunlardan bahsederseniz, tarayıcıların özelliklerini ekleyin.
T.Todua

10

FileSaver ( https://github.com/eligrey/FileSaver.js ) kullandım ve gayet iyi çalışıyor.
Örneğin, bu işlevi bir sayfada görüntülenen günlükleri dışa aktarmak için yaptım.
Blob'un örneklenmesi için bir dizi geçmek zorundasınız, bu yüzden belki de bunu doğru şekilde yazmadım, ama benim için çalışıyor.
Her ihtimale karşı, değiştirmeye dikkat edin: bu, global hale getirme sözdizimidir, aksi takdirde yalnızca ilk tanıştığı yerine geçer.

exportLogs : function(){
    var array = new Array();

    var str = $('#logs').html();
    array[0] = str.replace(/<br>/g, '\n\t');

    var blob = new Blob(array, {type: "text/plain;charset=utf-8"});
    saveAs(blob, "example.log");
}

2
FileSaver harika, burada IE10 öncesi işlevi için bir IE Shim preIE10SaveAs: (dosya adı, dosya içeriği, mimetype) {var w = window.open (); var doc = w.document; doc.open (mime türü, 'değiştir'); doc.charset = "utf-8"; (fileContent) doc.write; ) (doc.close; doc.execCommand ("SaveAs", boş, dosya adı); }
aqm

@ Aqm shim hakkında bir uyarı: Komut dosyası etiketlerini yürütür.
GameFreak

Ayrıca, koymak istenebilir w.close();sonraexecCommand
GameFreak

8

Benim için işe yarayan iki basit yaklaşım buldum. İlk olarak, zaten tıklanmış bir aöğeyi kullanarak ve indirme verilerini enjekte edin. İkincisi, aindirme verileriyle bir öğe oluşturmak , yürütmek a.click()ve tekrar kaldırmak. Ancak ikinci yaklaşım yalnızca bir kullanıcı tıklama eylemi tarafından çağrıldığında işe yarar. (Bazı) click()Yükleme gibi veya zaman aşımından sonra tetiklenen (setTimeout) gibi diğer bağlamlardan gelen tarayıcı bloğu .

<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <script type="text/javascript">
      function linkDownload(a, filename, content) {
        contentType =  'data:application/octet-stream,';
        uriContent = contentType + encodeURIComponent(content);
        a.setAttribute('href', uriContent);
        a.setAttribute('download', filename);
      }
      function download(filename, content) {
        var a = document.createElement('a');
        linkDownload(a, filename, content);
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
      }
    </script>
   </head>
  <body>
    <a href="#" onclick="linkDownload(this, 'test.txt', 'Hello World!');">download</a>
    <button onclick="download('test.txt', 'Hello World!');">download</button>
  </body>
</html>

2
Ayrıca abelgeyi belgeye (muhtemelen ile "display:none") ekleyebilir , tıklatabilir ve ardından kaldırabilirsiniz.
Teepeemm

1
Bu, indirme özelliğinin modern ie ve safari gibi bile desteklenmediği tarayıcılarda çalışır mı .. caniuse.com/#feat=download
Muhammad Umer

1
Sadece Safari 5.0'ı şarabın altında test ettim. İlk sürüm çalışıyor, ikincisi çalışmıyor. IE 8 (şarap) da test ettim ve çalışmıyor.
maikel

6

İşte Mathew'in önerdiği veri URI yöntemine bir bağlantı, safari üzerinde çalıştı, ancak dosya türünü ayarlayamadığım için iyi değil, "bilinmeyen" olarak kaydedildi ve daha sonra tekrar oraya gitmeli ve sırayla değiştirmeliyim dosyayı görüntülemek için ...

http://www.nihilogic.dk/labs/canvas2image/


4

LocalStorage'ı kullanabilirsiniz. Bu çerezlerin Html5 eşdeğeri. Firefox'ta Chrome ve Firefox AMA'da çalışıyor gibi görünüyor, bir sunucuya yüklemem gerekiyordu. Yani, doğrudan ev bilgisayarımda test yapmak işe yaramadı.

HTML5 örnekleri üzerinde çalışıyorum. Http://faculty.purchase.edu/jeanine.meyer/html5/html5explain.html adresine gidin. labirent birine ve kaydırma. Labirenti yeniden oluşturmak için bilgi localStorage kullanılarak saklanır.

Bu makaleye xml dosyalarını yüklemek ve çalışmak için HTML5 JavaScript aramaya geldim. Eski html ve JavaScript ile aynı mı ????


4

Deneyin

let a = document.createElement('a');
a.href = "data:application/octet-stream,"+encodeURIComponent('"My DATA"');
a.download = 'myFile.json';
a.click(); // we not add 'a' to DOM so no need to remove

İkili verileri indirmek istiyorsanız buraya bakın

Güncelleme

2020.06.14 Chrome'u 83.0 ve üstüne yükseltiyorum SO snippet stop çalışmaları ( korumalı alan güvenlik kısıtlamaları nedeniyle ) - ancak JSFiddle sürümü çalışıyor - burada


3

Daha önce belirtildiği gibi , FileWriter ve FileSystem ile birlikte File API API'leri, bir tarayıcı sekmesi / penceresi bağlamında bir istemcinin makinesinde dosya depolamak için kullanılabilir.

Bununla birlikte, bilmeniz gereken son iki API ile ilgili birkaç şey vardır:

  • API'ların uygulamaları şu anda yalnızca Chromium tabanlı tarayıcılarda (Chrome ve Opera) bulunmaktadır
  • Her iki API da 24 Nisan 2014 tarihinde W3C standartlarından çıkarıldı ve şu an için tescilli
  • Gelecekte (artık tescilli) API'lerin tarayıcı uygulamaktan kaldırılması bir olasılıktır
  • API'lerle oluşturulan dosyaları depolamak için bir korumalı alan (diskin üzerinde dosyaların hiçbir etki yaratmayacağı bir konum) kullanılır
  • Bir sanal dosya sistemi kullanılır (mutlaka tarayıcınızdan erişebilirsiniz olmadığını aynı formda diskte bulunmayan bir dizin yapısı) API'leri ile oluşturulmuş dosyaları temsil

API'lerin bunu yapmak için doğrudan ve dolaylı olarak nasıl kullanıldığına dair basit örnekler:

BakedGoods *

bakedGoods.get({
        data: ["testFile"],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(resultDataObj, byStorageTypeErrorObj){}
});

Ham File, FileWriter ve FileSystem API'lerini kullanma

function onQuotaRequestSuccess(grantedQuota)
{

    function saveFile(directoryEntry)
    {

        function createFileWriter(fileEntry)
        {

            function write(fileWriter)
            {
                var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
                fileWriter.write(dataBlob);              
            }

            fileEntry.createWriter(write);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: true, exclusive: true},
            createFileWriter
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

FileSystem ve FileWriter API'leri artık standartlar üzerinde yer almasa da, bazı durumlarda kullanımları haklı olabilir, çünkü:

  • Uygulama dışı bırakılan tarayıcı satıcılarının ilgisinin artması, onları doğrudan sitenin üzerine yerleştirebilir
  • Uygulama (Chromium tabanlı) tarayıcıların pazara nüfuzu yüksektir
  • Google (Chromium'un ana katkısı), API'lara kullanım ömrü vermemiştir ve kullanım ömrü sonu

Bununla birlikte, "bazı vakaların" kendi davalarınızı kapsaması, sizin karar vermeniz içindir.

* BakedGoods, buradaki başka biri tarafından korunmuyor :)


2

Bu iş parçacığı, bir sunucu olmadan istemci kodunda, bir ikili dosya oluşturmak ve adlandırılmış dosyayı indirmek istemini anlamak için çok değerli.

Benim için ilk adım, kaydettiğim verilerden ikili blob oluşturmaktı. Bunu tek bir ikili tip için yapmak için çok sayıda örnek var, benim durumumda blob oluşturmak için bir dizi olarak iletebileceğiniz birden fazla tip ile bir ikili format var.

saveAnimation: function() {

    var device = this.Device;
    var maxRow = ChromaAnimation.getMaxRow(device);
    var maxColumn = ChromaAnimation.getMaxColumn(device);
    var frames = this.Frames;
    var frameCount = frames.length;

    var writeArrays = [];


    var writeArray = new Uint32Array(1);
    var version = 1;
    writeArray[0] = version;
    writeArrays.push(writeArray.buffer);
    //console.log('version:', version);


    var writeArray = new Uint8Array(1);
    var deviceType = this.DeviceType;
    writeArray[0] = deviceType;
    writeArrays.push(writeArray.buffer);
    //console.log('deviceType:', deviceType);


    var writeArray = new Uint8Array(1);
    writeArray[0] = device;
    writeArrays.push(writeArray.buffer);
    //console.log('device:', device);


    var writeArray = new Uint32Array(1);
    writeArray[0] = frameCount;
    writeArrays.push(writeArray.buffer);
    //console.log('frameCount:', frameCount);

    for (var index = 0; index < frameCount; ++index) {

      var frame = frames[index];

      var writeArray = new Float32Array(1);
      var duration = frame.Duration;
      if (duration < 0.033) {
        duration = 0.033;
      }
      writeArray[0] = duration;
      writeArrays.push(writeArray.buffer);

      //console.log('Frame', index, 'duration', duration);

      var writeArray = new Uint32Array(maxRow * maxColumn);
      for (var i = 0; i < maxRow; ++i) {
        for (var j = 0; j < maxColumn; ++j) {
          var color = frame.Colors[i][j];
          writeArray[i * maxColumn + j] = color;
        }
      }
      writeArrays.push(writeArray.buffer);
    }

    var blob = new Blob(writeArrays, {type: 'application/octet-stream'});

    return blob;
}

Bir sonraki adım, tarayıcının kullanıcıdan bu blobunu önceden tanımlanmış bir adla indirmesini istemesini sağlamaktır.

İhtiyacım olan tek şey, ilk dosya adını yeniden adlandırmak için yeniden kullanabileceğim HTML5'e eklediğim adlandırılmış bir bağlantıydı. Bağlantının görüntülenmesi gerekmediğinden gizli tuttum.

<a id="lnkDownload" style="display: none" download="client.chroma" href="" target="_blank"></a>

Son adım kullanıcıdan dosyayı indirmesini istemektir.

var data = animation.saveAnimation();
var uriContent = URL.createObjectURL(data);
var lnkDownload = document.getElementById('lnkDownload');
lnkDownload.download = 'theDefaultFileName.extension';
lnkDownload.href = uriContent;
lnkDownload.click();

1

İşte dosyaları ZIP olarak dışa aktarmak için bir öğretici:

Başlamadan önce, dosyaları kaydetmek için bir kütüphane var, kütüphanenin adı fileSaver.js, Bu kütüphaneyi burada bulabilirsiniz. Şimdi gerekli kütüphaneleri ekleyelim:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.4/jszip.min.js"  type="text/javascript"></script>
<script type="text/javascript" src="https://fastcdn.org/FileSaver.js/1.1.20151003/FileSaver.js" ></script>

Şimdi bu kodu kopyalayın ve bu kod, Hello World içeriğine sahip hello.txt dosyası içeren bir zip dosyası indirecektir. Her şey yolunda giderse, bu bir dosya indirir.

<script type="text/javascript">
    var zip = new JSZip();
    zip.file("Hello.txt", "Hello World\n");
    zip.generateAsync({type:"blob"})
    .then(function(content) {
        // see FileSaver.js
        saveAs(content, "file.zip");
    });
</script>

Bu, file.zip adlı bir dosyayı indirecektir. Daha fazla bilgiyi buradan okuyabilirsiniz: http://www.wapgee.com/story/248/guide-to-create-zip-files-using-javascript-by-using-jszip-library

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.