स्टोरेज एपीआई

ऐप्लिकेशन डेवलपमेंट के करीब-करीब हर पहलू में डेटा भेजने या पाने के कुछ न कुछ एलिमेंट शामिल होते हैं. शुरू होने की तारीख बुनियादी बातों के साथ-साथ, आपको अपने ऐप्लिकेशन को डिज़ाइन और लागू करने के लिए एमवीसी फ़्रेमवर्क का इस्तेमाल करना चाहिए, वह डेटा उस डेटा पर ऐप्लिकेशन के व्यू से पूरी तरह अलग होता है (एमवीसी आर्किटेक्चर देखें).

आपको यह भी सोचना होगा कि आपका ऐप्लिकेशन ऑफ़लाइन होने पर, डेटा का इस्तेमाल कैसे किया जाता है (ऑफ़लाइन पहले देखें). इस दस्तावेज़ में स्थानीय रूप से डेटा भेजने, पाने, और सेव करने के स्टोरेज के विकल्पों के बारे में बताया गया है; यह दस्तावेज़ का शेष भाग आपको Chrome के फ़ाइल सिस्टम और सिंक फ़ाइल सिस्टम API का उपयोग करने का तरीका दिखाता है (यह भी देखें fileSystem API और syncFileSystem API).

स्टोरेज के विकल्प

पैकेज्ड ऐप्लिकेशन, डेटा भेजने और पाने के लिए कई तरीकों का इस्तेमाल करते हैं. बाहरी डेटा (संसाधन, वेब पेजों के लिए) है, तो आपको कॉन्टेंट की सुरक्षा के बारे में नीति (सीएसपी) के बारे में जानकारी होनी चाहिए. Chrome से मिलते-जुलते एक्सटेंशन के तौर पर, रिमोट सर्वर से संपर्क करने के लिए क्रॉस-ऑरिजिन XMLHttpRequests का इस्तेमाल किया जा सकता है. आपने लोगों तक पहुंचाया मुफ़्त में बाहरी पेजों को भी आइसोलेट कर सकता है, ताकि आपका बाकी ऐप्लिकेशन सुरक्षित रहे (बाहरी वेब एम्बेड करना देखें) पेज).

डिवाइस पर डेटा सेव करते समय, स्ट्रिंग को सेव करने के लिए Chrome Storage API का इस्तेमाल करें डेटा और IndexedDB का इस्तेमाल करें. IndexedDB के साथ, आप JavaScript ऑब्जेक्ट को ऑब्जेक्ट को स्टोर करना और डेटा के बारे में क्वेरी करने के लिए स्टोर के इंडेक्स का इस्तेमाल करना. ज़्यादा जानने के लिए, HTML5 रॉक का सिंपल टूडो देखें ट्यूटोरियल की सूची). बाइनरी डेटा जैसे दूसरे सभी तरह के डेटा के लिए, फ़ाइल सिस्टम और सिंक का इस्तेमाल करें फ़ाइल सिस्टम एपीआई.

Chrome के फ़ाइल सिस्टम और सिंक फ़ाइल सिस्टम एपीआई, HTML5 FileSystem API का इस्तेमाल करते हैं. Chrome की Filesystem API, ऐप्लिकेशन उपयोगकर्ता के सैंडबॉक्स किए गए सेक्शन को बना सकते हैं, पढ़ सकते हैं, नेविगेट कर सकते हैं और उसमें लिख सकते हैं लोकल फ़ाइल सिस्टम. उदाहरण के लिए, फ़ोटो शेयर करने वाला ऐप्लिकेशन किसी फ़ाइल को पढ़ने और उसमें बदलाव करने के लिए, Filesystem API का इस्तेमाल कर सकता है जिन्हें कोई उपयोगकर्ता चुनता है.

Chrome के Sync Filesystem API की मदद से, ऐप्लिकेशन उपयोगकर्ता की Google Drive में मौजूद डेटा को सेव और सिंक कर सकते हैं, ताकि अलग-अलग क्लाइंट के बीच एक ही डेटा उपलब्ध हो सकता है. उदाहरण के लिए, क्लाउड-बैक्ड टेक्स्ट Editor ऐप्लिकेशन, उपयोगकर्ता के Google Drive खाते में नई टेक्स्ट फ़ाइलों को अपने-आप सिंक कर सकता है. जब उपयोगकर्ता किसी नए क्लाइंट में टेक्स्ट एडिटर खोलता है, तो Google Drive नई टेक्स्ट फ़ाइलों को टेक्स्ट एडिटर के तौर पर.

Chrome Filesystem API का इस्तेमाल करना

फ़ाइल सिस्टम से जुड़ी अनुमति जोड़ी जा रही है

Chrome के File System API का इस्तेमाल करने के लिए, आपको "fileSystem" जोड़ना होगा की अनुमति होनी चाहिए, इसलिए ताकि आप स्थायी डेटा को सेव करने के लिए उपयोगकर्ता से अनुमति ले सकें.

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

फ़ाइलें चुनने के लिए उपयोगकर्ता के विकल्प

उपयोगकर्ता हमेशा की तरह फ़ाइलें चुनने की उम्मीद करते हैं. वे कम से कम ' फ़ाइल' और मानक फ़ाइल-चुनने वाला बटन. अगर आपका ऐप्लिकेशन बहुत ज़्यादा फ़ाइल-हैंडिंग का इस्तेमाल करता है, तो आपको 'खींचें और छोड़ें' सुविधा लागू करें (नीचे देखें और नेटिव HTML5 खींचें और छोड़ें सुविधा भी देखें).

फ़ाइल एंट्री का पाथ पाना

उपयोगकर्ता ने जो फ़ाइल चुनी है उसका पूरा पाथ पाने के लिए, fileEntry, getDisplayPath() पर कॉल करें:

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

'खींचें और छोड़ें' सुविधा लागू करना

अगर आपको 'खींचें और छोड़ें' विकल्प को लागू करना है, तो फ़ाइल कंट्रोलर (dnd.js) को खींचें और छोड़ें तो filesystem-access नमूना एक अच्छा शुरुआती बिंदु है. कंट्रोलर, फ़ाइल एंट्री बनाता है इसके लिए, DataTransferItem खींचें और छोड़ें. इस उदाहरण में, fileEntry को पहली वैल्यू पर सेट किया गया है छोड़ा गया आइटम.

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

कोई फ़ाइल पढ़ना

यह कोड, फ़ाइल को सिर्फ़ पढ़ने के लिए खोलता है और FileReader ऑब्जेक्ट का इस्तेमाल करके उसे टेक्स्ट के तौर पर पढ़ता है. अगर आपने फ़ाइल मौजूद नहीं है, तो एक गड़बड़ी होती है.

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);
    });
    });
});

फ़ाइल लिखना

फ़ाइल लिखने के दो सामान्य उदाहरण "सेव करें" हैं और "इस रूप में सेव करें" चुनें. इस कोड की मदद से रीड-ओनली chosenFileEntry से writableEntry और उसमें चुनी गई फ़ाइल लिख देता है.

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

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

यह कोड "इस रूप में सेव करें" के साथ एक नई फ़ाइल बनाता है और नया BLOB को फ़ाइल के लिए, writer.write() तरीके का इस्तेमाल करना होगा.

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 का इस्तेमाल करना

सिंक किए जा सकने वाले फ़ाइल स्टोरेज का इस्तेमाल करके, लौटाए गए डेटा ऑब्जेक्ट को लोकल सिस्टम की तरह ही ऑपरेट किया जा सकता है FileSystem API में ऑफ़लाइन फ़ाइल सिस्टम इंस्टॉल करें, लेकिन उसके जुड़े हुए (और अपने-आप) सिंक होने की सुविधा के साथ डेटा को Google डिस्क में सेव करना है.

फ़ाइल सिस्टम को सिंक करने की अनुमति जोड़ी जा रही है

Chrome के Sync Filesystem API का इस्तेमाल करने के लिए, आपको "syncFileSystem" जोड़ना होगा के लिए अनुमति मेनिफ़ेस्ट किया है, ताकि आप स्थायी डेटा को सेव और सिंक करने के लिए उपयोगकर्ता से अनुमति ले सकें.

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

सिंक की जा सकने वाली फ़ाइल को सेव करने की प्रोसेस शुरू की जा रही है

अपने ऐप्लिकेशन में फ़ाइल सिंक करने की सुविधा शुरू करने के लिए, syncFileSystem.requestFileSystem पर कॉल करें. इस तरीके से, सिंक किया जा सकने वाला ऐसा फ़ाइल सिस्टम लौटाया जाता है जो Google Drive के साथ काम करता है. उदाहरण के लिए:

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

फ़ाइल सिंक होने की स्थिति के बारे में जानकारी

किसी मौजूदा फ़ाइल के सिंक होने की स्थिति जानने के लिए, syncFileSystem.getFileStatus का इस्तेमाल करें:

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

फ़ाइल सिंक करने की स्थिति के लिए, इनमें से कोई एक वैल्यू हो सकती है: 'synced', 'pending' या 'conflicting'. 'सिंक किया गया' यह मतलब है कि फ़ाइल पूरी तरह से सिंक की हुई है; कोई भी लंबित स्थानीय परिवर्तन नहीं हैं जिन्हें Google Drive से सिंक किया गया है. हालांकि, Google Drive में कुछ बदलाव होने बाकी हो सकते हैं अभी तक फ़ेच नहीं किए गए हैं.

'मंज़ूरी बाकी है' का अर्थ है कि फ़ाइल में ऐसे बदलाव हैं जिन्हें अभी तक Google डिस्क में सिंक नहीं किया गया है. अगर ऐप्लिकेशन ऑनलाइन चलने पर, स्थानीय बदलाव (करीब) Google डिस्क से तुरंत सिंक हो जाते हैं और syncFileSystem.onFileStatusChanged इवेंट को 'synced' स्थिति के साथ सक्रिय किया गया (इसके लिए नीचे देखें ज़्यादा जानकारी देखें).

syncFileSystem.onFileStatusChanged तब ट्रिगर किया जाता है, जब फ़ाइल की स्थिति 'conflicting'. 'विरोधी' इसका मतलब है कि लोकल स्टोरेज और स्टोरेज, दोनों में कॉन्फ़्लिक्टिंग चेंज (परस्पर विरोधी बदलाव) मिले हैं Google Drive. कोई फ़ाइल इस स्थिति में सिर्फ़ तब हो सकती है, जब विवाद सुलझाने की नीति इस पर सेट हो 'manual'. डिफ़ॉल्ट नीति 'last_write_win' है और विवादों का समाधान आसान अंतिम-लिखने-जीतने की नीति है. सिस्टम की विरोधाभास समाधान नीति इनके साथ बदली जा सकती है syncFileSystem.setConflictResolutionPolicy.

अगर कॉन्फ़्लिक्ट रिज़ॉल्यूशन की नीति को 'manual' पर सेट किया जाता है और फ़ाइल के नतीजे 'conflicting' होते हैं, तो ऐप्लिकेशन अब भी फ़ाइल को लोकल ऑफ़लाइन फ़ाइल के रूप में पढ़ और लिख सकता है, लेकिन बदलाव सिंक नहीं किए जाते और फ़ाइल को अन्य क्लाइंट पर किए गए रिमोट बदलावों से तब तक अलग रखा जाएगा, जब तक कि विवाद न हो जाए समाधान किया गया. विवाद को हल करने का सबसे आसान तरीका यह है कि फ़ाइल के लोकल वर्शन को मिटाएं या उसका नाम बदलें. इससे रिमोट वर्शन को सिंक होने के लिए कहा जाता है, विरोधी स्थिति ठीक की जाती है, और onFileStatusChanged इवेंट, 'synced' स्टेटस के हिसाब से ट्रिगर होता है.

सिंक की गई स्थिति में हुए बदलावों को सुना जा रहा है

किसी फ़ाइल के सिंक होने की स्थिति बदलने पर, syncFileSystem.onFileStatusChanged इवेंट ट्रिगर किया जाता है. उदाहरण के लिए, मान लीजिए कि किसी फ़ाइल में बदलाव होने बाकी हैं और वह 'मंज़ूरी बाकी' है राज्य. ऐसा हो सकता है कि यह ऐप्लिकेशन ताकि बदलाव सिंक होने वाला हो. जब सिंक करने वाली सेवा स्थानीय बदलाव लंबित है और बदलाव को Google डिस्क पर अपलोड कर दिया जाता है, तो सेवा इन वैल्यू वाला onFileStatusChanged इवेंट: { fileEntry:a fileEntry for the file, status: 'synced', action: 'updated', direction: 'local_to_remote' }.

इसी तरह, स्थानीय गतिविधियों पर ध्यान दिए बिना, सिंक सेवा साथ ही, Google Drive से बदलावों को लोकल स्टोरेज में डाउनलोड कर देता है. अगर रिमोट बदलाव सिर्फ़ नई फ़ाइल जोड़ने के लिए किया गया था, तो इन वैल्यू वाला इवेंट ट्रिगर होता है: { fileEntry: a fileEntry for the file, status: 'synced', action: 'added', direction: 'remote_to_local' }.

अगर एक ही फ़ाइल के लिए, लोकल और रिमोट साइड, दोनों में कॉन्फ़्लिक्टिंग चेंज (परस्पर विरोधी बदलाव) मिलते हैं और रिज़ॉल्यूशन नीति को 'manual' पर सेट किया गया है. फ़ाइल का स्टेटस बदलकर conflicting हो गया है. अब यह स्थिति होगी यह सिंक सेवा से अलग किया जाता है और विवाद सुलझने तक सिंक नहीं किया जाता. इसमें केस-इन वैल्यू वाला इवेंट ट्रिगर होता है: { fileEntry: a fileEntry for the file, status: 'conflicting', action: null, direction: null }.

आपके पास इस इवेंट के लिए लिसनर जोड़ने का विकल्प है. यह इवेंट, स्टेटस में होने वाले किसी भी बदलाव के बारे में बताता है. उदाहरण के लिए, Chrome Music Player ऐप्लिकेशन Google डिस्क से सिंक किए गए किसी भी नए संगीत को सुनता है, लेकिन अभी तक नहीं किसी क्लाइंट के लिए उपयोगकर्ता के लोकल स्टोरेज में इंपोर्ट किया गया हो. अगर कोई संगीत मिलता है, तो वह उससे सिंक हो जाता है क्लाइंट:

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 कितना डेटा इस्तेमाल कर रहा है, ऐप्लिकेशन की सैंडबॉक्स की गई लोकल डायरेक्ट्री से क्वेरी करें या syncFileSystem.getUsageAndQuota के ज़रिए वापस की गई इस्तेमाल बाइट की जानकारी:

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

Google Drive में, उपयोगकर्ता के सिंक बैकएंड सेवा का स्टोरेज भी देखा जा सकता है. सिंक की गई फ़ाइलें हैं किसी छिपे हुए Google Drive फ़ोल्डर, Chrome Syncable FileSystem में सेव की गई हैं. फ़ोल्डर यहां नहीं दिखाया जाएगा आपकी 'मेरी ड्राइव' सूची है, लेकिन इसे खोज बॉक्स में फ़ोल्डर का नाम खोजकर ऐक्सेस किया जा सकता है. (ध्यान दें कि रिमोट फ़ोल्डर का लेआउट इस बात की गारंटी नहीं है कि रिलीज़ के बीच पुराने सिस्टम के साथ काम करता रहेगा.)