Pobierz pliki takie jak mega.co.nz

89

Dzisiaj sprawdziłem mega.co.nz i jestem podekscytowany niektórymi funkcjami. Na przykład na stronie pobierania pobierze pliki w przeglądarce, a następnie odszyfruje je za pomocą javascript.

na przykład zobacz ten link, aby pobrać plik png:

https://mega.co.nz/#!7JRgFJzJ!efpJGWuPhYczLexY19ex82nuwfs4sR_DG4JXddeClH4

w tym linku rozpocznie pobieranie w przeglądarce. Sprawdziłem zakładkę sieciową w elemencie inspect, to pobierze części pliku z AJAXem, po tym jak skompletuje wszystkie części pliku, zapisze je wszystkie w jednym pliku na komputerze automatycznie!

chcę wiedzieć, co robią? czy możesz wyjaśnić lub zamieścić link do jakiegoś źródła na temat pobierania plików w przeglądarce w taki sposób?

też można to zrobić tylko za pomocą javascript, czy też powinno się użyć jakichś wtyczek flash lub czegoś w tym rodzaju?

Amir Molaa
źródło
3
Tak, a jeśli pobierzesz duży plik, system zwalnia do indeksowania z powodu ciągłego stronicowania
kinokijuf

Odpowiedzi:

102

Mega używa do tego kilku różnych metod: (stan na 27 listopada 2013 r.)

  1. API systemu plików (wypełnienie rozszerzeń Chrome / Firefox)
  2. Adobe Flash SWF Filewriter (zapasowe starsze przeglądarki)
  3. BlobBuilder (IE10 / IE11)
  4. Rozszerzenie MEGA do przeglądarki Firefox (wycofane)
  5. Arraybuffer / Blob (w pamięci) + a [download] (dla przeglądarek obsługujących [download])
  6. MediaSource (eksperymentalne rozwiązanie do przesyłania strumieniowego)
  7. Blob przechowywany w magazynie IndexedDB + a [pobieranie] (Firefox 20+, poprawa w stosunku do metody Blob w pamięci)

(źródło: https://eu.static.mega.co.nz/js/download_6.js )

roberto
źródło
ale myślę, że działa też w przeglądarce Firefox. znalazłem tutaj próbkę jsfiddle.net/kGLnP/5 . ten przykład działa poprawnie na chrome i firefox. ale co robią w innych przeglądarkach, takich jak safari czy opera? Mogę pobrać linki mega.co.nz również w tych przeglądarkach ..
Amir Molaa
1
Tak, próbka podałeś ( jsfiddle.net/kGLnP/5 ) powinny pracować dla Firefoksa, ale tylko ostatnie z nich (wersja 20 lub nowsza, zobacz developer.mozilla.org/en-US/docs/HTML/Element/a dla więcej informacji o podporach). Właśnie przeczytałem kod JavaScript Mega i zaktualizowałem moją odpowiedź. (Odpowiada na twoje pytanie dotyczące innych przeglądarek. Zasadniczo będą one uciekać się do korzystania z Flasha, gdy nie mogą korzystać z rozwiązań opartych tylko na JS.)
roberto
Wow, właśnie wczoraj widziałem tę witrynę i zamierzałem zadać to samo pytanie. Kiedy próbowałem pobrać mod do gry, byłem zaskoczony, że pobieranie rozpoczyna się natychmiast w przeglądarce, pokazując moją pełną prędkość !!! Używałem FF 20.0.1.
Wel
Czy odpowiedź Roberto jest nadal aktualna? Próbowałem pobrać duży plik z mega.co.nz w przeglądarce Firefox i wyłączyłem flashowanie i nadal działało. Podczas próby pobrania dużego pliku, Firefox prosi o zgodę na przechowywanie więcej niż 50 MB, co sprawia, że ​​myślę, że używają indexedDB.
shacharz
1
Nie, nie jest (naprawdę) aktualny, aktualny skrypt pobierania jest tutaj: eu.static.mega.co.nz/download_46.js . Rzuciłem okiem i nadal jest mniej więcej te same sztuczki z kilkoma nowymi dodatkami, w tym ulepszeniami wydajności przez buforowanie (używając IndexedDB, jak się domyślasz). Zaktualizuję odpowiedź, gdy będę miał czas na odczytanie kodu.
roberto
4

Podstawowa implementacja multipart w przeglądarce downloader użyciu blob i URL API doprowadza się tutaj . Pobiera plik w 4 jednoczesnych żądaniach i pokazuje również postęp. Należy pamiętać, że wydaje się, że ustawienie rangenagłówka może generalnie nie być dobrym pomysłem w przypadku żądań XHR, spójrz na ten temat .

Podczas pobierania:

Podczas pobierania

Po pobraniu:

Po pobraniu

Innym interesującym tematem byłoby wdrożenie funkcji Pause / Resume z Mega. XHR API obecnych przeglądarek nie oferuje takiej możliwości, więc jedyną szansą, jaką masz, jest pobranie wielu małych fragmentów i rezygnacja z pobranej części małych fragmentów, tak jak się wydaje, jest to również robione na Mega. Ale fetchdo tego celu można użyć funkcji przesyłania strumieniowego, nie zbadałem tego wystarczająco dobrze, ale jest to udokumentowane tutaj .

Przy okazji, spójrz na te niesamowite projekty:

Ebrahim Byagowi
źródło
3

MEGAcmd

Jest megacmd , oficjalny interfejs wiersza poleceń. Możesz również zbudować go ze źródeł na github pod adresem https://github.com/meganz/MEGAcmd

megacmd jest opakowaniem dla Mega SDK i jeśli zdecydujesz się skompilować go samodzielnie, będziesz potrzebować tych samych zależności (na ubuntu), jak te wymienione poniżej dla Mega SDK.

Szczegółowe informacje na temat użytkowania można znaleźć w podręczniku użytkownika MEGAcmd .

Mega SDK

Mega SDK, który można skompilować, wykonując czynności opisane na stronie github . Zawiera megaclinarzędzie, które jest interaktywną powłoką do synchronizacji i pobierania / wysyłania.

## compilation steps for ubuntu
git clone --depth 1 https://github.com/meganz/sdk megasdk
cd megasdk
sudo apt install libcurl4-openssl-dev  libc-ares-dev libssl-dev libcrypto++-dev  zlib1g-dev libsqlite3-dev  libfreeimage-dev libswscale-dev
autogen.sh
./configure
make -j 8  ## pass the number of CPUs you have to speed up compilation
sudo make install

mega.py moduł pythona (przestarzały)

Dla tych, którzy znaleźli to pytanie, szukając rzeczywistego przepisu na pobranie linku w trybie tekstowym, oto prosty skrypt w Pythonie, który używa modułu mega.py (zainstaluj go z sudo pip install mega.py):

import sys
import getpass
#install the module with: 'sudo pip install mega.py'
from mega import Mega

email = '[email protected]'
password = getpass.getpass(prompt='Mega password for {}:'.format(email))

mega = Mega({'verbose': True})
m = mega.login(email, password)
m.download_url(sys.argv[1])

Skrypt działa z Pythonem 2.7 i pobiera adres URL linku mega.nz.

getpass służy do bezpiecznego wprowadzania hasła w konsoli, aby uniknąć przechowywania hasła w skrypcie - jeśli nie masz problemu z zakodowaniem hasła na stałe, ustaw je w linii # 7.

megatools

Na większości skrzynek Linux / Posix możesz zainstalować megatools ze standardowych repozytoriów, tj

W systemie ubuntu / debian:

apt install megatools

W systemie MacOS:

brew install megatools

Po zainstalowaniu znajdziesz szereg narzędzi wiersza poleceń, wśród megadlktórych możesz pobierać zarówno pliki udostępnione, jak i własne. Zobacz megadl -hszczegóły.

ccpizza
źródło
0

Od 2020 r. Możesz używać Service Workers do bezproblemowej integracji własnego kodu z wbudowanym menedżerem pobierania przeglądarki: https://developers.google.com/web/updates/2016/06/sw-readablestreams

Wydaje mi się również, że miałbyś następujące nagłówki, aby plik został pobrany, a nie przeglądany:

 headers: {
   'Content-Type': 'application/octet-stream',
   'Content-Disposition': 'attachment; filename="your_filename.bin"',
 }

Osobiście stwierdziłem, że to podejście działa bezbłędnie zarówno w Google Chrome w Firefoksie, jak i już używam go w produkcji.

vdudouyt
źródło