2013-10-10 25 views
10

WebRTC ile bir FileShare uygulaması geliştiriyorum. İstemci JavaScript/HTML’de uygulamak istiyorum. Kod, istemci tarayıcısında çalıştırılmalıdır. WebRTC aracılığıyla indirildiğinde bunları kaydetmem gerekiyor. Dosyalar oldukça büyük olabilir ve onları bir dosya olarak diske kaydetmeden önce bunları tamamen yükleyemiyorum ve bir dizi veya blob içine kaydedemiyorum.İstemci tarafından oluşturulan verileri JavaScript olarak dosya olarak kaydet

Dosyaları elime aldıklarında dosyalara kaydetmeme izin veren herhangi bir API var mı?

Şimdiye kadar Downloadify, FileSave.js ve html5 FileWriterApi şimdiye kadar bulduk. İlk ikisi yığınlanmamış ve kaydetmeden önce tüm dosyayı önce belleğe indirmemi zorunlu kılsa da, FileWriterAPI çoğu tarayıcıda kullanılamaz.

+0

http://help.infragistics.com/Help/NetAdvantage/ASPNET/2013.1/CLR4.0/html/WebUpload_Saving_Files_as_Stream.html http://www.aurigma.com/docs/iu7/saving-uploaded- files-in-aspnet.htm Size yardımcı olabilecek iki bağlantıya sahibim –

+0

Makul büyüklükteki dosyalar için, ilk içgüdüm her bloğu kendi 'Blob'unda depolamak, hepsini büyük bir Blob'la birleştirmek. sonunda (yeni kurucu kullanarak) ve son 'Blob' kurtarmak için' createObjectURL' kullanın.IIRC, JS 'Blob'lar gerektiğinde diske saklanır, bu yüzden dosyalar çok büyük olmadıkça (ya da gerçekten yanlış;), çok korkunç olmamalı mı? –

+0

@JordanGray İyi bir fikir olabilir - İndirilen parçaların tarayıcı oturumları arasında sürekli olarak indirilmeye devam etmesi gerektiğine inanıyorum, ancak eğer bu değilse, bu en temiz fikir olabilir (eğer tarayıcılar gerektiğinde blobun dosyada kalmasını sağlıyorsa). –

cevap

11

, lekeler yılında parçalarını tasarrufu ve daha geniş bir blob onları birleştiren kapsamalıdır: topakları

  • Sebat gerekli değildir (yani tarayıcının kapatılması tüm parçaları siler)
  • Dosya, yalnızca kendi dosya sistemiyle kaydetme tarafından kullanıcı tarafından devam ettirilir. Kullanıcı, kaydedilen dosyaya yeniden erişim izni vermedikçe, web uygulaması dosya kapatıldıktan sonra erişemeyecektir.
  • Dosya boyutları çok büyük değilse (bunu bulmak için karşılaştırma yapmak zorunda kalacaksınız). Chrome, 1GB'lık toplam parça için benim için oldukça iyi davrandı.

simple test for using blobs as chunks ürününü oluşturdum. Farklı boyut ve yığın numaraları parametrelerle etrafında oynayabilir: o sebat ihtiyacın varsa

var chunkSize = 500000; 
var totalChunks = 200; 
var currentChunk = 0; 
var mime = 'application/octet-binary'; 
var waitBetweenChunks = 50; 

var finalBlob = null; 
var chunkBlobs =[]; 

function addChunk() { 
    var typedArray = new Int8Array(chunkSize); 
    chunkBlobs[currentChunk] = new Blob([typedArray], {type: mime}); 
    console.log('added chunk', currentChunk); 
    currentChunk++; 
    if (currentChunk == totalChunks) { 
     console.log('all chunks completed'); 
     finalBlob = new Blob(chunkBlobs, {type: mime}); 
     document.getElementById('completedFileLink').href = URL.createObjectURL(finalBlob); 
    } else { 
     window.setTimeout(addChunk, waitBetweenChunks); 
    } 
} 
addChunk(); 

W3C File System API neye ihtiyacınız desteklemelidir. Dosyaları ayırmak için parçaları yazmak için kullanabilirsiniz ve tüm parçalar tamamlandığında hepsini okuyabilir ve bunları tek bir dosyaya ekleyebilir ve parçaları kaldırabilirsiniz.

Uygulamanız için korumalı bir dosya sistemi atayarak çalıştığını unutmayın (belirli bir kota için) ve dosyalar yalnızca bu uygulama için erişilebilir durumdadır. Dosyalar web uygulamasının dışında kullanılacaksa, dosyayı uygulama dosya sisteminden "normal" dosya sistemine kaydetmek için kullanılan işleve ihtiyacınız olabilir. createObjectURL() yöntemini kullanarak böyle bir şey yapabilirsiniz.

Geçerli tarayıcı desteği durumu hakkında haklısınız. A Filesystem API polyfill kullanılabilir, bu dosya sistemi öykünme arka uç olarak IndexedDB (daha yaygın olarak desteklenen) dayanmaktadır. Polyfill'i büyük dosyalarda test etmedim. Boyut sınırlarına veya performans sınırlamalarına girebilirsiniz.

+0

Yup, bu aklımda olan oldukça buydu. Spesifikasyonu anlamış olmama dayanarak, makul ölçüde iyi ölçeklenebilmeli, parçalar gerektiğinde altta yatan depolamaya devam etmelidir. :) –

+0

Bu, diske kaydetmeden önce hala belleğe ilk kaydediliyor gibi görünüyor (currentChunk == totalChunks) ', doğru mu? – dman

+0

Hayır, yeni Blob(), diskteki bir nesneye bir işaretçi döndürüyormuş gibi düşünün. https://developer.mozilla.org/en/docs/Web/API/Blob –

3

https://github.com/Peer5/Sharefest çıkışını kontrol ettiniz mi? Bu bir çözüm olmadığını duyabilecek gereksinimleri önerilen Jordan-gri @ gibi

+2

da onlar için bir sorun gibi görünüyor ... https://github.com/Peer5/ShareFest/issues/53 –

İlgili konular