Jak rozszerzenie Chrome może zapisać wiele plików w katalogu określonym przez użytkownika?

Pracuję nad rozszerzeniem Chrome, które będzie używane jako narzędzie wewnętrzne. Jego wymagane zachowanie to:

  1. jako działanie strony włącz ikonę paska adresu podczas przeglądania niektórych stron intranetu.
  2. gdy użytkownik kliknie ikonę, zidentyfikuj wszystkie pliki określonego typu nośnika (np.jpg) na stronie oraz
  3. po cichu zapisz je wszystkie w katalogu na dysku lokalnym użytkownika.

To pytanie zostało zadane wcześniej , ale odpowiedź brzmiała wtedy " użyj NPAPI", a NPAPI jest teraz opuszczony.

Więc, jaki jest obecnie dostępny sposób, aby to osiągnąć? Te które oglądałem to:

  • chrome.FileSystem API --- ale to nie zapisuje plików w dowolnym miejscu dostępnym dla użytkownika. Zamiast tego przechowywane pliki są ukryte za zaciemnionymi nazwami W nieudokumentowanym katalogu. Użytkownik wymaga, aby pliki były przechowywane pod oryginalnymi nazwami w dostępnym katalogu.
  • HTML5 Pobierz atrybut , tworząc adres URL danych i programowo klikając go. To wyskakuje "Zapisz jako..."okno dialogowe dla każdego pliku, co jest niedopuszczalne, gdy na jednej stronie znajduje się sto zasobów. Użytkownik wymaga, aby pliki były pobierane bez dalszej interakcji poza jednym kliknięciem ikony.
  • Chrome Download API , ale jest to dostępne tylko w kanałach beta i dev. Użytkownik wymaga tego rozszerzenia pracy z głównym nurtem Chrome.
  • Użyj natywne API wiadomości poprzez utworzenie małegoexe, który po prostu zapisuje plik na dysk, a następnie przekazuje .jpg jako blob do niego. Wydaje się to bardzo uciążliwe i nie jestem nawet pewien, jak niezawodnie przekazać duże plamy takim Exom.

Czy Mogę spróbować innego podejścia?

Author: Community, 2013-11-06

3 answers

Zrobiłeś sporo badań. W rzeczywistości zwykłe strony internetowe nie mogą pisać do systemu plików Użytkownika bez żadnych wtyczek lub rozszerzeń. Ponadto, HTML5 API systemu plików zapewnia dostęp tylko do wirtualnego systemu plików, jak zauważyłeś.

Jednakże, jesteś mylące chrome.fileSystem API z API systemu plików HTML5. W przeciwieństwie do HTML FileSystem API, API Chrome fileSystem (app) Może bezpośrednio zapisywać do systemu plików użytkownika (np. użytkownik.

Ten API jest dostępny tylko dla aplikacji Chrome , a nie dla rozszerzeń. Nie jest to problem, zwłaszcza, że rozwijasz wewnętrzne narzędzie, ponieważ możesz zainstalować aplikację i rozszerzenie, i używać przekazywanie wiadomości do komunikacji między rozszerzeniem (akcja strony) i aplikacją (dostęp do systemu plików) ( przykład ).


O chrome.downloads: ponieważ Twoje rozszerzenie jest wewnętrzne, prawdopodobnie możesz zmusić użytkowników do wejścia na kanał beta / dev w celu użyj tego API. Jedynym ograniczeniem tego API jest to, że pliki będą zapisywane w (podkatalogu) folderu pobrań zdefiniowanego przez użytkownika.

EDIT: API chrome.downloads jest teraz dostępne we wszystkich kanałach, w tym w gałęzi stabilnej (od Chrome 31).

 45
Author: Rob W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 19:14:26

Obawiam się, że odrobiłeś pracę domową, co oznacza, że przyjrzałeś się wszystkim możliwym alternatywom.

Najlepszym sposobem, aby osiągnąć dokładnie to, co chcesz, byłoby (jak wspomniałeś) za pomocą wsparcia natywnej aplikacji i komunikowania się za pośrednictwem natywnych wiadomości. BTW, ponieważ przepustowość rzadko stanowi problem w intranetach, łatwiej byłoby przekazać adresy URL zasobów (np. obrazów) i poprosić aplikację o ich pobranie i zapisanie.
(Tak, będzie to bardziej uciążliwe niż po prostu opracowanie przedłużenie, ale jeden musi robić to, co oni, prawda ?)

Z drugiej strony, jeśli jesteś gotów poświęcić trochę doświadczenia użytkownika nad prostotą rozwoju, proponuję połączenie gadżetów HTML5 (które pozwalają tworzyć i pobierać plik lokalnie) z biblioteką js zipping (np. JSZip), tak więc użytkownik musi pobrać tylko jeden plik zip(i jest wyświetlany tylko raz). BTW, jeśli użytkownik chce, może wybrać zawsze pobrać pliki bez podpowiedzi (ale już o tym wiedziałeś).

 6
Author: gkalpak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 06:23:34

Użyj pomysłu natywnej aplikacji do przesyłania wiadomości.

Natywna aplikacja jest uciążliwa i trudna do napisania, ponieważ dokumentacja jest słaba, a jeśli nie uzyskasz dokładnie poprawnego formatowania JSON na obu końcach, nie zobaczysz niczego w konsoli, ponieważ stdin i stdout są przejmowane.

Ale będziesz szczęśliwszy, gdy to zrobisz, ponieważ możesz korzystać ze standardowych narzędzi (np. Eksplorator Windows, edytor hex, TeamViewer...), aby wyświetlić, przenieść i usunąć Pliki, a w przeciwnym razie zobaczyć, co się dzieje. Chrome ' s sand-boxed file system działa, ale wydaje się być teraz ślepy zaułek(żadne inne przeglądarki nie podłapały go). Nikt prawdopodobnie nie opracuje dla niego narzędzi innych firm. Oczywiście prawdopodobnie nie potrzebujesz narzędzi, gdy wszystko działa, ale do tego czasu debugowanie jest koszmarem, ponieważ musisz napisać kod (i sporo kodu) tylko po to, aby śledzić, jakie pliki są w jakich katalogach, wersjach plików, pozostałej przestrzeni dyskowej...

 3
Author: DaveWalley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 20:36:34