bunu yapmanın bir yolu var olduğunu olmayabilir, ama bir Chrome yalnızca Dosya Sistemi API dayanır. Korumalı bir dosya sisteminde geçici bir dosya oluşturup yazacağız ve işimiz bittikten sonra normal dosya sistemine kopyalayacağız. Bu şekilde, tüm dosyayı belleğe kaydetmeniz gerekmez.Chrome API'sinin senkronize olmayan sürümü şu anda W3C tarafından standartlaştırma için dikkate alınmıyor, ancak senkronize olan (web çalışanlarını kullanan) verison. Tarayıcı desteği bir endişe ise, o zaman bu cevap sizin için değildir.
API bu gibi çalışır: Öncelikle tarayıcıdan requestFileSystem()
fonksiyonunu olsun. Biz erişimi olduğunu Şimdi
var fileSystem; //This will store the fileSystem for later access
var fileSize = 1024*1024 //Our maximum file system size.
function errorHandler(e) {
console.log('Error: ' + e.name);
}
window.requestFileSystem(window.TEMPORARY, fileSize, function (fs) { fileSystem = fs; }, errorHandler);
:
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
Sonra, talep geçici dosya sistemi (biz kullanıcı izin istemek gerekmez bu şekilde): Şu anda "webkit" öneki
var fileOptions = {
create: true, //If the file is not found, create it
exclusive: false //Don't throw an error if the file doesn't exist
};
Burada biz yoksa bir dosya oluşturabilirsiniz
getFile()
fonksiyonunu çağırır: dosya sistemine bir dosya oluşturmak zamanıdır. Geri aramada, dosyaya yazmak için yeni bir
fileWriter
oluşturabilirsiniz.
fileWriter
daha sonra dosyanın sonuna taşınır ve buna eklemek için yeni bir metin bloğu oluştururuz.
fileSystem.root.getFile(fileName, fileOptions, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.seek(fileWriter.length);
var blob = new Blob([STRING_TO_WRITE], {type: 'text/plain'});
fileWriter.write(blob);
}, errorHandler);
});
Bu API'nın normal, kullanıcı dosya sistemine kaydedilmediğini unutmayın. Bunun yerine, özel bir korumalı klasöre kaydeder. Kullanıcının dosya sistemine kaydetmek istiyorsanız, bir filesystem:
bağlantısı oluşturabilirsiniz. Kullanıcı tıkladığında, onları kaydetmesini isteyecektir. Kaydettikten sonra, geçici dosyayı kaldırabilirsiniz.
var save = function() {
var download = document.querySelector("a[download]");
if (!fileSystem) { return; }
fileSystem.root.getFile(fileName, {create: false, exclusive: true}, function(fileEntry) {
download.href = fileEntry.toURL();
}, errorHandler);
}
dosyanın indirilmesini zorlar indirme özelliği olan bir bağlantı kullanma:
Bu fonksiyon fileEntry
'ın toURL()
işlevini kullanarak filesystem
bağlantı oluşturur. Umarım bu istediğini yapar http://plnkr.co/edit/q6ihXWEXSOtutbEy1b5G?p=preview
: Burada
<a download></a>
bu gösteren bir plunker olduğunu. Dosyaya sürekli olarak ekleyebilir, bellekte saklanmayacaktır, ancak kullanıcı normal dosya sistemine kaydedinceye kadar korumalı dosya sisteminde olacaktır.
Daha fazla bilgi için, daha yeni, eşzamanlı Web Çalışanı API'sini kullanmak isterseniz, bu HTML5rocks article veya this one'a bakın.
bir hizmet işçinin yardımıyla veri https://developer.mozilla.org/ (a [Blob] veri koymak en-US/docs/Web/API/Blob) ve sonra indirme için bir bağlantı oluşturmak için [createObjectURL()] (https://developer.mozilla.org/de/docs/Web/API/URL.createObjectURL) kullanın. . Tarayıcılar muhtemelen diskteki verileri önbelleğe alacaktır ve özellikle büyük bir veri URL'niz olmayacaktır. – Phillip
@Phillip Tüm içeriği bir blob veya zip dosyasına kaydetmek veya indexDb'yi kullanmak istemiyorum, akış şarttır. – DhruvPathak
no. Tüm mevcut tarayıcı teknolojileri, ilk baytları göndermeden önce tüm boyutların bilinmesini gerektirir; node.js gibi sadece daha yeni sunucu tarafı şeyler, http1.1 chunking'i kullanabilir. birçok bağlantı veya arabellek kullanmanız gerekecek. websockets kullanabilirsiniz, ancak bu iki ucunda biraz özelleştirme gerektirecektir. – dandavis