para modo lighthouse google extensiones extension cómo cual create crear compatibilidad chrome aplicaciones activar javascript google-chrome google-chrome-extension

javascript - modo - extensiones



¿Cómo puede una extensión de Chrome guardar muchos archivos en un directorio especificado por el usuario? (3)

Estoy trabajando en una extensión de Chrome para ser utilizada como una herramienta interna. Su comportamiento requerido es:

  1. Como acción de página, active el icono de la barra de direcciones cuando vea ciertas páginas de intranet.
  2. cuando el usuario hace clic en el icono, identifica todos los archivos de un determinado tipo de medio (por ejemplo, .jpg) en la página, y
  3. silenciosamente guárdelos todos en un directorio en la unidad local del usuario.

Esta pregunta se hizo antes , pero la respuesta fue " use NPAPI ", y NPAPI ahora está abandonada .

Entonces, ¿cuál es la forma disponible actualmente para lograr esto? Los que he visto son:

  • La API chrome.FileSystem --- pero esto no guarda los archivos en ninguna ubicación accesible para el usuario. En cambio, los archivos almacenados se ocultan detrás de nombres ofuscados en un directorio no documentado. El usuario requiere que los archivos se almacenen con sus nombres originales en un directorio accesible.
  • El atributo de descarga HTML5 , al crear una URL de datos y al hacer clic en ella programáticamente. Esto muestra un cuadro de diálogo "guardar como ..." para cada archivo, que es inaceptable cuando hay cientos de activos en una sola página. El usuario requiere que los archivos se descarguen sin más interacción más allá del solo clic del icono.
  • La API de descarga de Chrome , pero solo está disponible en los canales beta y dev. El usuario requiere que esta extensión funcione con Chrome convencional.
  • Use Native Messaging API creando un .exe pequeño que simplemente guarde un archivo en el disco, y luego pase el archivo .jpg como un blob. Esto parece muy engorroso y ni siquiera estoy seguro de cómo pasar de manera confiable blobs grandes a EXEs como ese.

¿Hay otro enfoque que pueda probar?


Has investigado bastante. De hecho, las páginas web comunes no pueden escribir en el sistema de archivos del usuario sin complementos o extensiones. Además, la API del Sistema de Archivos HTML5 solo proporciona acceso a un sistema de archivos virtual, como habrás observado.

Sin embargo, está confundiendo la API chrome.fileSystem con la API de FileSystem HTML5. A diferencia de la API HTML FileSystem, la API fileSystem (app) de Chrome puede escribir directamente en el sistema de archivos del usuario (por ejemplo, ~/Documents o %USERPROFILE%/Documents ), especificado por el usuario.

Esta API solo está disponible para las aplicaciones de Chrome, no para las extensiones. Esto no es un problema, especialmente porque está desarrollando una herramienta interna, porque puede instalar la aplicación y la extensión, y usar el paso de mensajes para comunicarse entre la extensión (acción de página) y la aplicación (acceso al sistema de archivos) ( example ).

Acerca de chrome.downloads : dado que su extensión es interna, probablemente pueda forzar a los usuarios a ingresar al canal beta / dev para usar esta API. La única limitación de esta API es que los archivos se guardarán en (un subdirectorio de) la carpeta de descargas definida por el usuario.

EDIT: la API chrome.downloads ahora está disponible en todos los canales, incluida la rama estable (desde Chrome 31).


Me temo que has hecho tu tarea, lo que significa que estudiaste todas las alternativas posibles.

La mejor manera de lograr exactamente lo que desea, sería (como lo mencionó) usar una aplicación nativa compatible y comunicarse a través de Native Messaging. Por cierto, dado que el ancho de banda rara vez es un problema en las intranets, es posible que le resulte más sencillo pasar los recursos (p. Ej., Imágenes) a las URL y hacer que la aplicación se descargue y guarde.
(Sí, será más engorroso que simplemente desarrollar una extensión, pero uno tiene que hacer lo que tiene que hacer, ¿no?)

Por otro lado, si está dispuesto a sacrificar un poco de la experiencia del usuario por la simplicidad del desarrollo, le sugiero que combine los elementos de HTML5 (que le permiten crear y descargar un archivo localmente) con una biblioteca de JSZip JS (por ejemplo, JSZip ), por lo que el usuario solo tiene que descargar un solo archivo zip (y solo se le solicita una vez). Por cierto, si el usuario lo desea, puede elegir descargar siempre los archivos sin preguntar (pero ya lo sabía).


Use la idea de la aplicación Native Messaging App.

La aplicación nativa es engorrosa y una tarea difícil de escribir porque la documentación es deficiente, y a menos que obtenga el formato JSON exactamente correcto en ambos extremos, no verá nada en una consola porque se tomaron stdin y stdout.

Sin embargo, será más feliz cuando esté listo, ya que puede usar herramientas estándar (por ejemplo, Windows Explorer, un editor hexadecimal, TeamViewer ...) para ver, mover y eliminar archivos, y ver lo que está sucediendo. El sistema de archivos en caja de arena de Chrome funciona, pero ahora parece ser un callejón sin salida (ningún otro navegador lo ha recogido). Nadie es probable que desarrolle herramientas de terceros para ello. Por supuesto, probablemente no necesite herramientas una vez que todo esté funcionando, pero hasta entonces, la depuración es una pesadilla porque necesita escribir código (y bastante código) solo para rastrear qué archivos están en qué directorios, versiones de archivos, Espacio del disco...