Storage API'leri

Uygulama geliştirmenin neredeyse her alanında bir miktar veri gönderme veya alma işlemi vardır. En temel konulardan başlayarak, uygulamanızı tasarlamanıza ve uygulamanıza yardımcı olacak bir MVC çerçevesi kullanmalısınız. Bu sayede veriler, uygulamanın bu verilerle ilgili görünümünden tamamen ayrı tutulur (bkz. MVC Mimarisi).

Ayrıca, uygulamanız çevrimdışıyken verilerin nasıl işleneceğini düşünmeniz gerekir (bkz. Önce Çevrimdışı). Bu dokümanda, verileri yerel olarak gönderme, alma ve kaydetmeyle ilgili depolama seçenekleri kısaca tanıtılmaktadır. Belgenin geri kalanında Chrome'un Dosya Sistemi ve Dosya Sistemi API'lerini nasıl kullanacağınız gösterilmektedir (fileSystem API ve syncFileSystem API'ye de göz atın).

Depolama seçenekleri

Paket uygulamalar, veri göndermek ve almak için birçok farklı mekanizma kullanır. Harici veriler için (kaynaklar, web sayfaları) İçerik Güvenliği Politikası (İGP) hakkında bilgi sahibi olmanız gerekir. Chrome Uzantılarına benzer şekilde, uzak sunucularla iletişim kurmak için cross-origin XMLHttpRequests aracını kullanabilirsiniz. Ayrıca, uygulamanızın geri kalanının güvende olması için harici sayfaları da izole edebilirsiniz (bkz. Harici web sayfaları yerleştirme).

Verileri yerel olarak kaydederken, az miktarda dize verisi kaydetmek için Chrome Storage API'yi, yapılandırılmış verileri kaydetmek için IndexedDB'yi kullanabilirsiniz. IndexedDB ile JavaScript nesnelerini bir nesne deposunda tutabilir ve verileri sorgulamak için mağazanın dizinlerini kullanabilirsiniz (daha fazla bilgi edinmek için HTML5 Rock'ın Basit Yapılacaklar Listesi Eğiticisi'ne bakın). İkili program verileri gibi diğer tüm veri türleri için Dosya Sistemi ve Senkronizasyon Dosya Sistemi API'lerini kullanın.

Chrome'un Dosya Sistemi ve Senkronizasyon Dosya Sistemi API'leri, HTML5 Dosya Sistemi API'sinin kapsamını genişletmiştir. Chrome'un Filesystem API'si sayesinde uygulamalar kullanıcının yerel dosya sisteminin korumalı alana alınmış bir bölümünde oluşturabilir, okuyabilir, gezebilir ve buraya yazabilir. Örneğin, bir fotoğraf paylaşma uygulaması kullanıcının seçtiği fotoğrafları okumak ve yazmak için Filesystem API'yi kullanabilir.

Chrome'un Senkronizasyon Filesystem API'si sayesinde uygulamalar, kullanıcının Google Drive'ına veri kaydedip senkronize edebilir. Böylece, aynı veriler farklı istemcilerde kullanılabilir. Örneğin, bulut destekli bir metin düzenleyici uygulaması, yeni metin dosyalarını kullanıcının Google Drive hesabıyla otomatik olarak senkronize edebilir. Kullanıcı, metin düzenleyiciyi yeni bir istemcide açtığında, Google Drive yeni metin dosyalarını söz konusu metin düzenleyici örneğine aktarır.

Chrome Filesystem API'sini Kullanma

Dosya sistemi izni ekleniyor

Chrome'un File System API'sini kullanmak için manifest dosyasına "fileSystem" iznini eklemeniz gerekir. Böylece, kalıcı verileri depolamak için kullanıcıdan izin alabilirsiniz.

"permissions": [
  "...",
  "fileSystem"
]

Dosya seçmek için kullanıcı seçenekleri

Kullanıcılar, dosyaları her zaman olduğu gibi seçmek isterler. En azından, bir "dosya seç" düğmesi ve standart bir dosya seçici beklerler. Uygulamanız dosya işlemeyi yoğun bir şekilde kullanıyorsa sürükleyip bırakma yöntemini de uygulamanız gerekir (aşağıya bakın ve Yerel HTML5 Sürükle ve Bırak konusuna bakın).

fileEntry'nin yolunu alma

Kullanıcının seçtiği dosyanın tam yolunu almak için fileEntry getDisplayPath() numaralı telefonu arayın:

function displayPath(fileEntry) {
  chrome.fileSystem.getDisplayPath(fileEntry, function(path) {
    console.log(path)
  });
}

Sürükle ve bırak işlevini uygulama

Sürükleyip bırakma seçimini uygulamanız gerekirse filesystem-access örneğindeki sürükleyip bırakma dosya denetleyicisi (dnd.js) iyi bir başlangıç noktasıdır. Kumanda, sürükleyip bırakma yöntemiyle DataTransferItem öğesinden dosya girişi oluşturur. Bu örnekte, fileEntry ilk bırakılan öğe olarak ayarlanmıştır.

var dnd = new DnDFileController('body', function(data) {
  var fileEntry = data.items[0].webkitGetAsEntry();
  displayPath(fileEntry);
});

Dosya okuma

Aşağıdaki kod dosyayı açar (salt okunur) ve bir FileReader nesnesini kullanarak dosyayı metin olarak okur. Dosya mevcut değilse bir hata verilir.

var chosenFileEntry = null;

chooseFileButton.addEventListener('click', function(e) {
  chrome.fileSystem.chooseEntry({type: 'openFile'}, function(readOnlyEntry) {

    readOnlyEntry.file(function(file) {
      var reader = new FileReader();

      reader.onerror = errorHandler;
      reader.onloadend = function(e) {
        console.log(e.target.result);
      };

      reader.readAsText(file);
    });
    });
});

Dosya yazma

Dosya yazmak için yaygın olarak kullanılan iki kullanım alanı "Kaydet" ve "Farklı kaydet"dir. Aşağıdaki kod, salt okunur chosenFileEntry öğesinden bir writableEntry oluşturur ve seçilen dosyayı buna yazar.

 chrome.fileSystem.getWritableEntry(chosenFileEntry, function(writableFileEntry) {
    writableFileEntry.createWriter(function(writer) {
      writer.onerror = errorHandler;
      writer.onwriteend = callback;

    chosenFileEntry.file(function(file) {
      writer.write(file);
    });
  }, errorHandler);
});

Aşağıdaki kod, "Farklı kaydet" işleviyle yeni bir dosya oluşturur ve writer.write() yöntemini kullanarak yeni blob'u dosyaya yazar.

chrome.fileSystem.chooseEntry({type: 'saveFile'}, function(writableFileEntry) {
    writableFileEntry.createWriter(function(writer) {
      writer.onerror = errorHandler;
      writer.onwriteend = function(e) {
        console.log('write complete');
      };
      writer.write(new Blob(['1234567890'], {type: 'text/plain'}));
    }, errorHandler);
});

Chrome Sync Filesystem API'sini Kullanma

Senkronize edilebilir dosya depolama kullanılarak döndürülen veri nesneleri, FileSystem API'deki yerel çevrimdışı dosya sistemleriyle aynı şekilde çalıştırılabilir, ancak bu veriler Google Drive'a ek (ve otomatik) senkronize edilir.

Senkronizasyon dosya sistemi izni ekleniyor

Chrome'un Senkronizasyon Dosya Sistemi API'sini kullanmak için manifeste "syncFileSystem" iznini eklemeniz gerekir. Böylece, kalıcı verileri depolamak ve senkronize etmek için kullanıcıdan izin alabilirsiniz.

"permissions": [
  "...",
  "syncFileSystem"
]

Senkronize edilebilir dosya depolama alanı başlatılıyor

Uygulamanızda senkronize edilebilir dosya depolama işlemini başlatmak için syncFileSystem.requestFileSystem'ı çağırmanız yeterlidir. Bu yöntem, Google Drive tarafından desteklenen senkronize edilebilir bir dosya sistemi döndürür. Örneğin:

chrome.syncFileSystem.requestFileSystem(function (fs) {
   // FileSystem API should just work on the returned 'fs'.
   fs.root.getFile('test.txt', {create:true}, getEntryCallback, errorCallback);
});

Dosya senkronizasyon durumu hakkında

Geçerli bir dosyanın senkronizasyon durumunu öğrenmek için syncFileSystem.getFileStatus öğesini kullanın:

chrome.syncFileSystem.getFileStatus(entry, function(status) {...});

Dosya senkronizasyon durumu değerleri şunlardan biri olabilir: 'synced', 'pending' veya 'conflicting'. "Senkronize edildi" ifadesi dosyanın tamamen senkronize edildiği anlamına gelir. Google Drive'la senkronize edilmemiş, beklemede olan yerel değişiklik yoktur. Ancak Google Drive tarafında henüz getirilmemiş, beklemede olan değişiklikler olabilir.

"Beklemede", dosyada henüz Google Drive ile senkronize edilmemiş, beklemede olan değişiklikler bulunduğu anlamına gelir. Uygulama çevrimiçi çalışıyorsa, yerel değişiklikler (neredeyse) hemen Google Drive ile senkronize edilir ve syncFileSystem.onFileStatusChanged etkinliği, 'synced' durumuyla tetiklenir (ayrıntılı bilgi için aşağıya bakın).

Bir dosyanın durumu 'conflicting' olarak değiştiğinde syncFileSystem.onFileStatusChanged tetiklenir. "Çakışan" ifadesi, hem yerel depolama alanında hem de Google Drive'da çakışan değişiklikler olduğu anlamına gelir. Bir dosya, yalnızca çakışma çözümü politikası 'manual' değerine ayarlanmışsa bu durumda olabilir. Varsayılan politika 'last_write_win' şeklindedir ve çakışmalar basit son-yazma-kazan politikasıyla otomatik olarak çözülür. Sistemin çakışma çözümü politikası syncFileSystem.setConflictResolutionPolicy ile değiştirilebilir.

Çakışma çözümleme politikası 'manual' değerine ayarlanırsa ve bir dosya 'conflicting' durumunda olursa uygulama yine de dosyayı yerel çevrimdışı dosya olarak okuyup yazabilir, ancak değişiklikler senkronize edilmez ve dosya, çakışma çözülene kadar diğer istemcilerde yapılan uzaktan değişikliklerden ayrı tutulur. Bir çakışmayı çözmenin en kolay yolu dosyanın yerel sürümünü silmek veya yeniden adlandırmaktır. Bu işlem, uzak sürümü senkronize etmeye zorlar, çakışma durumu çözümlenir ve onFileStatusChanged etkinliği 'synced' durumuyla tetiklenir.

Senkronize edilmiş durumdaki değişiklikler dinleniyor

Bir dosyanın senkronizasyon durumu değiştiğinde syncFileSystem.onFileStatusChanged etkinliği tetiklenir. Örneğin, bir dosyada beklemede olan değişiklikler olduğunu ve dosyanın "beklemede" durumunda olduğunu varsayalım. Uygulama, değişiklik senkronize edilmek üzere olarak çevrimdışı durumda olabilir. Senkronizasyon hizmeti, beklemedeki yerel değişikliği tespit edip değişikliği Google Drive'a yüklediğinde onFileStatusChanged etkinliğini aşağıdaki değerlerle tetikler: { fileEntry:a fileEntry for the file, status: 'synced', action: 'updated', direction: 'local_to_remote' }.

Benzer şekilde, yerel etkinliklerden bağımsız olarak senkronizasyon hizmeti başka bir istemci tarafından yapılan uzaktan değişiklikleri algılayıp değişiklikleri Google Drive'dan yerel depolama alanına indirebilir. Uzaktan yapılan değişiklik yeni bir dosya eklemekle ilgiliyse aşağıdaki değerlere sahip bir etkinlik tetiklenir: { fileEntry: a fileEntry for the file, status: 'synced', action: 'added', direction: 'remote_to_local' }.

Aynı dosya için hem yerel hem de uzak tarafta çakışan değişiklikler varsa ve çakışma çözümü politikası 'manual' olarak ayarlanırsa dosya durumu conflicting olarak değiştirilir, senkronizasyon hizmetinden ayrılır ve çakışma çözülene kadar senkronize edilmez. Bu durumda, aşağıdaki değerlere sahip bir etkinlik tetiklenir: { fileEntry: a fileEntry for the file, status: 'conflicting', action: null, direction: null }.

Bu etkinlik için, durumdaki değişikliklere yanıt veren bir işleyici ekleyebilirsiniz. Örneğin, Chrome Müzik Oynatıcı uygulaması, Google Drive'dan senkronize edilen ancak henüz kullanıcının belirli bir istemcideki yerel depolama alanına aktarılmayan yeni müzikleri dinler. Bulunan tüm müzikler o istemciyle senkronize edilir:

chrome.syncFileSystem.onFileStatusChanged.addListener(function(fileInfo) {
  if (fileInfo.status === 'synced') {
    if (fileInfo.direction === 'remote_to_local') {
      if (fileInfo.action === 'added') {
        db.add(fileInfo.fileEntry);
      } else if (fileInfo.action === 'deleted') {
        db.remove(fileInfo.fileEntry);
      }
    }
  }
});

API kullanımı kontrol ediliyor

API'nin kullandığı veri miktarını kontrol etmek için uygulamanın korumalı alana alınmış yerel dizinini veya syncFileSystem.getUsageAndQuota tarafından döndürülen kullanım baytlarını sorgulayın:

chrome.syncFileSystem.getUsageAndQuota(fileSystem, function (storageInfo) {
   updateUsageInfo(storageInfo.usageBytes);
   updateQuotaInfo(storageInfo.quotaBytes);
});

Ayrıca kullanıcının senkronizasyon arka uç hizmeti depolama alanına da (Google Drive'da) bakabilirsiniz. Senkronize edilen dosyalar, gizli bir Google Drive klasörü olan Chrome Senkronize Edilebilir Dosya Sistemi'ne kaydedilir. Klasör, "Drive 'ım" listenizde gösterilmez ancak arama kutusunda klasör adını arayarak erişilebilir. (Uzak klasör düzeninin sürümler arasında geriye dönük uyumlu olmaya devam edeceğinin garanti edilmediğini unutmayın.)