plugin make how google extensions extension developer create chrome apps javascript html5 google-chrome google-chrome-extension google-chrome-app

javascript - make - Almacenamiento ilimitado de archivos en la aplicación Chrome



how to do a chrome extension (2)

Quiero guardar una cantidad ilimitada de archivos en el disco duro de los usuarios, sin hacer que el usuario haga clic en un cuadro de diálogo.

La única documentación que he visto sobre el uso del almacenamiento ilimitado está aquí: https://developers.google.com/chrome/whitepapers/storage , que dice que solo está disponible para las aplicaciones de Chrome.

Todos los ejemplos que he visto de Chrome fileSystem API sugieren que para crear un nuevo archivo y escribir en él, el usuario necesita obtener un objeto de entrada de la función chrome.fileSystem.chooseEntry , lo que significa que el usuario debe ir a través de un cuadro de diálogo.

La API regular de fileSystem parece que puede guardar un archivo en la zona de fileSystem la extensión del usuario sin hacer que el usuario vaya a través de un cuadro de diálogo, pero me pregunto si tiene el permiso "unlimitedStorage" que solo se otorga a las aplicaciones. No me sorprendería que solo la API de Chrome tenga ese permiso.

Si utilizo la API de fileSystem regular, necesito solicitar el sistema de archivos usando window.webkitRequestFileSystem (estoy sorprendido de que window.requestFileSystem no me funcione en Chrome), pero el método toma el type ( "persistent" o "temporary" ), y el size (los bytes que la aplicación requerirá para el almacenamiento) argumentos.

Obviamente no haces eso en la API de Chrome. Sin embargo, la API de fileSystem normal fileSystem permite solicitar más almacenamiento cuando lo necesites utilizando la API de administración de cuotas, que también está documentada en la página que he vinculado anteriormente.

Y en https://developers.google.com/chrome/apps/docs/developers_guide#manifest , dice:

El campo "permissions" permite especificar los permisos HTML5 que requiere la aplicación. Al especificar "unlimitedStorage" y "notifications" , esta aplicación puede usar esas características HTML5 sin tener que pedirle permiso repetidamente al usuario. Durante la instalación de la aplicación, al usuario se le informa qué permisos necesita la aplicación; la instalación de la aplicación concede implícitamente esos permisos a todas las páginas cuyas URL coinciden con las del campo "apps" del manifiesto.

Así que espero que el permiso "unlimitedStorage" simplemente signifique que puedo llamar a window.webkitRequestFileSystem(window.PERSISTENT, anySize, successCallback) , y en lugar de pedirle al usuario que aumente la cuota cuando lo necesite, Chrome lo hace automáticamente .

Pregunta 1: ¿Alguien sabe si esa es la forma en que funciona?

Sin embargo, si solo la API de Chrome tiene ese permiso "unlimitedStorage" , podría intentar crear una entrada de archivo con la API normal y pasar esa entrada a las funciones de la API de Chrome, omitiendo la necesidad de un cuadro de diálogo y obteniendo acceso a el permiso "unlimitedStorage" .

Pregunta 2: ¿Es posible para mí crear la entrada en una API y pasarla a la otra? Me temo que las diferentes API pueden tener diferentes areneros.

La documentación en la API de fileSystem no es excelente, así que pensé en preguntar si alguien sabía por experiencia previa. Cuantos menos agujeros de conejo, mejor.


En primer lugar, para evitar confusiones, lo que aquí se llama una "aplicación empaquetada" debería llamarse una "Aplicación de Chrome".

Si el blob va a ser utilizado por cualquier otra aplicación, debe obtener un FileEntry través de chrome.fileSystem.chooseEntry para que los datos se escriban en el sistema de archivos de la computadora donde el usuario pueda acceder. (Puede obtener un directorio del usuario de esa manera y guardar la entrada retenida, y usar eso sin pedirle al usuario que haga una elección cada vez).

Si el blob es solo para uso de esa aplicación de Chrome, puede usar el archivo API sin llamar a chrome.fileSystem.chooseEntry .

En cuanto a los límites, tiene razón en que unlimitedStorage permite un almacenamiento ilimitado. En mis experimentos, a pesar de la documentación, nunca he podido obtener una aplicación de Chrome para pedir al usuario que autorice una cantidad específica. Yo uso ese permiso, y parece que no hay límite. La documentación de Google que he leído parece ser inexacta.

Si escribe en el sistema de archivos externo, después de haber llamado a chrome.fileSystem.chooseEntry , no hay límites y no necesita permiso unlimitedStorage .


Mi solución.

main.js

var chooseDirectory = function() { chrome.app.window.create("choose_directory.html"); }; chrome.runtime.onInstalled.addListener(function(details) { if (details.reason == ''install'') { chooseDirectory(); } }; chrome.runtime.onMessageExternal.addListener(function(message, sender, sendResponse) { switch (message.type) { case ''saveBlob'': var blob = new Blob([message.blob]) chrome.storage.local.get(''filesystemKey'', function(items) { var fileSystemRef = items.fileSystemKey; chrome.fileSystem.restoreEntry(fileSystemRef, function(fileSystem) { fileSystem.getFile(''test.txt'', { create: true }, function(fileEntry) { fileEntry.createWriter(function(writer) { writer.write(blob); }); }); }); }); break; } });

después de usar las API del sistema de archivos chrome, usa la API regular del sistema de archivos html5 para crear el archivo. Como se explica aquí, no puede llamar a la función chooseDirectory del script de fondo, por lo que debe crear una ventana de aplicación que pueda llamarlo, lo cual hago a continuación.

choose_directory.js

window.addEventListener(''load'', function() { document.getElementById(''input'').addEventListener(''click'', function() { chrome.fileSystem.chooseEntry({type: ''openDirectory''}, function(entry) { var homeDirectory = chrome.fileSystem.retainEntry(entry); chrome.storage.local.set({''filesystemKey'': homeDirectory}, function() { window.close(); }); }); }); });

choose_directory.html

<script src="choose_directory.js"></script> You need to choose a directory where you will store your files. <button id="input"> Chose a place to save your files</button>