5

In Chrome Apps, che sto scaricando un contenuto blob da un server utilizzando JavaScript XHR (angolare $ HTTP GET in particolare, con il tipo di risposta 'blob')App Chrome: come salvare il contenuto blob in file System in background?

Come devo salvare questo file system dell'applicazione Chrome?

Attualmente utilizzando un involucro angolare su HTML5 file system API https://github.com/maciel310/angular-filesystem

non voglio mostrare all'utente un pop-up (quindi non posso usare chrome.fileSystem. chooseEntry)

Il chrome.fileSystem.requestFileSystem API è supportata solo dai Kiosk- solo app. Quindi sto usando l'API FileSystem HTML5 invece di Chrome.

Sto usando il seguente codice per rendere XHR per recuperare blob.

$http({ 
      url: SERVER_URL+"/someVideo.mp4", 
      method: "GET", 
      responseType: "blob" 
     }).then(function(response) { 
      console.log(response); 
      fileSystem.writeBlob(response.name, response).then(function() { 
      console.log("file saved"); 
      }, function(err) { 
       console.log(err); 
      }); 
     }, function (response) { 

     }); 

Questo è il mio metodo WriteBLOB

writeBlob: function(fileName, blob, append) { 
    append = (typeof append == 'undefined' ? false : append); 

    var def = $q.defer(); 

    fsDefer.promise.then(function(fs) { 

     fs.root.getFile(fileName, {create: true}, function(fileEntry) { 

      fileEntry.createWriter(function(fileWriter) { 
       if(append) { 
        fileWriter.seek(fileWriter.length); 
       } 

       var truncated = false; 
       fileWriter.onwriteend = function(e) { 
        //truncate all data after current position 
        if (!truncated) { 
         truncated = true; 
         this.truncate(this.position); 
         return; 
        } 
        safeResolve(def, ""); 
       }; 

       fileWriter.onerror = function(e) { 
        safeReject(def, {text: 'Write failed', obj: e}); 
       }; 

       fileWriter.write(blob); 

      }, function(e) { 
       safeReject(def, {text: "Error creating file", obj: e}); 
      }); 

     }, function(e) { 
      safeReject(def, {text: "Error getting file", obj: e}); 
     }); 

    }, function(err) { 
     def.reject(err); 
    }); 

    return def.promise; 
}, 

Questo dimostra come SECURITY_ERRIt was determined that certain files are unsafe for access within a Web application, or that too many calls are being made on file resources.

Qual è la soluzione per questo?

Ho provato a utilizzare il flag --allow-file-access-from-files durante l'avvio dell'app. Non aiuta

+1

Quando dici che non vuoi mostrare un popup.html ti basta dire che non desidera un pop-up che si verifichi? Significa che è necessario che lo script venga eseguito dalla scheda visualizzata con un metodo click? – wuno

+0

Voglio dire che il video deve essere salvato automaticamente in background. non dovrebbe richiedere all'utente dove salvare, cosa che accade con il metodo choosEntry –

+0

hai accettato la risposta dall'altra domanda come risposta n? – wuno

risposta

2

stoccaggio sandbox di Chrome applicazione non consente la memorizzazione dei file nella directory principale (vale a dire /)

modificare il codice per salvarlo in una specifica sotto-directory sotto di essa. Per esempio -

fileSystem.writeBlob("/new"+response.name, response).then(function() { 
      console.log("file saved"); 
      }, function(err) { 
       console.log(err); 
      }); 

Questo farebbe risparmiare correttamente il file sotto /new/ directory.

+0

È documentato ovunque? – Xan

+0

@ Xan Purtroppo no! L'ho trovato su un forum https://groups.google.com/a/chromium.org/forum/#!topic/chromium-apps/j4f48wn-pBE (leggi la risposta di Joe Marini - seconda riga) –

+0

Um, argomento sbagliato può essere? La voce della directory del pacchetto è completamente di sola lettura. – Xan