A compatibilidade com blobs do IndexedDB foi transferida para o Chrome Dev

Eiji Kitamura
Eiji Kitamura

O Chrome Dev deixou de oferecer suporte ao Blob no IndexedDB.

Esse é um recurso muito esperado pelo Chrome que permite que a API IndexedDB armazene e recupere um Blob sem o converter em uma string Base64.

O IndexedDB fornece armazenamento permanente do tipo chave-valor em grande escala, disponível na maioria dos navegadores mais recentes. O Safari parece ser compatível com o iOS 8 e o Mac OS X 10.10. Confira o status de implementação dela.

O Blob é um objeto binário semelhante a um arquivo que os mecanismos JavaScript modernos podem manipular. Os objetos File são herdados de Blob. Você também pode buscar imagens e arquivos como Blob via XMLHttpRequest. Confira o status de implementação dela.

Como armazenar um blob no IndexedDB

Não há como detectar a disponibilidade de Blobs no IndexedDB. Você basicamente tem que try-catch e, em seguida, usar string em vez de Blob se ele não estiver disponível. Confira alguns exemplos de código:

// Create an example Blob object
var blob = new Blob(['blob object'], {type: 'text/plain'});

try {
    var store = db.transaction(['entries'], 'readwrite').objectStore('entries');

    // Store the object  
    var req = store.put(blob, 'blob');
    req.onerror = function(e) {
        console.log(e);
    };
    req.onsuccess = function(event) {
        console.log('Successfully stored a blob as Blob.');
    };
} catch (e) {
    var reader = new FileReader();
    reader.onload = function(event) {
        // After exception, you have to start over from getting transaction.
        var store = db.transaction(['entries'], 'readwrite').objectStore('entries');

        // Obtain DataURL string
        var data = event.target.result;
        var req = store.put(data, 'blob');
        req.onerror = function(e) {
            console.log(e);
        };
        req.onsuccess = function(event) {
            console.log('Successfully stored a blob as String.');
        };
    };
    // Convert Blob into DataURL string
    reader.readAsDataURL(blob);
}

O suporte a blobs para IndexedDB já está disponível no Firefox e também no Internet Explorer. A compatibilidade com o Safari precisa ser investigada.

Aproveite!