5

W Chrome Apps, jestem pobieranie zawartości blob z serwera przy użyciu JavaScript XHR (kątowa $ HTTP GET w szczególności z odpowiedzi typu „blob”)Aplikacje Chrome: jak zapisywać zawartość bloba w systemie plików w tle?

Jak mam zapisać to do systemu plików Chrome aplikacji?

Obecnie używając kątowym opakowanie na HTML5 API systemu plików https://github.com/maciel310/angular-filesystem

nie chcę, aby pokazać użytkownikowi okienko (stąd nie mogę używać chrome.fileSystem. chooseEntry)

chrome.fileSystem.requestFileSystem API jest obsługiwany tylko przez Kiosk- tylko aplikacje. Dlatego używam API FileSystem HTML5 zamiast chrome.

Używam następującego kodu, aby XHR mógł pobrać obiekt typu 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) { 

     }); 

To jest moja metoda 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; 
}, 

To pokazuje SECURITY_ERR jak It was determined that certain files are unsafe for access within a Web application, or that too many calls are being made on file resources.

Jakie jest rozwiązanie tego problemu?

Próbowałem używać flagi --allow-file-access-from-files podczas uruchamiania aplikacji. To nie pomaga.

+1

Kiedy mówisz, że nie chcesz, aby pokazać popup.html po prostu nie znaczy, że nie ma popup wystąpić? Co oznacza, że ​​skrypt ma być uruchamiany z karty wyświetlanej za pomocą metody kliknięcia? – wuno

+0

Mam na myśli, że wideo powinno być automatycznie zapisywane w tle. nie powinno podpowiadać użytkownikowi, gdzie zapisać, co się dzieje z wyborem w przypadku wybrania mefhod –

+0

, czy odpowiedź na drugie pytanie została przyjęta jako odpowiedź n? – wuno

Odpowiedz

2

przechowywania piaskownicy Chrome aplikacja nie pozwala pliki mają być przechowywane w katalogu głównym (tj /)

zmodyfikować kod, aby zapisać go w specjalnym podkatalogu pod nim. Na przykład -

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

To powodzeniem zapisać plik pod /new/ katalogu.

+0

Czy to jest udokumentowane w dowolnym miejscu? – Xan

+0

@Xan Niestety nie! Znalazłem to na forum https://groups.google.com/a/chromium.org/forum/#!topic/chromium-apps/j4f48wn-pBE (przeczytaj odpowiedź Joe Mariniego - druga linia) –

+0

Um, niewłaściwy temat może? Pozycja katalogu pakietu jest w pełni przeznaczona tylko do odczytu. – Xan