Завантажуйте такі файли, як mega.co.nz


89

Сьогодні я перевірив mega.co.nz і мене хвилюють деякі функції. Наприклад, на сторінці завантаження він буде завантажувати файли в браузер і після цього розшифровувати їх за допомогою JavaScript.

наприклад, див. це посилання для завантаження файлу png:

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

за цим посиланням розпочнеться завантаження всередині браузера. я перевірив вкладку мережі в елементі inspect, він завантажить частини файлу за допомогою AJAX, після чого всі частини файлу завершить, автоматично збереже їх у одному файлі на комп'ютері!

я хочу знати, чим вони займаються? Ви можете пояснити або посилатися на якийсь ресурс про завантаження файлів у браузері так?

також це можна зробити лише за допомогою javascript, чи слід використовувати деякі флеш-плагіни чи щось подібне?


3
Так, і якщо ви завантажуєте великий файл, система сповільнюється до сканування через постійне підкачування
kinokijuf

Відповіді:


102

Для цього Mega використовує кілька різних методів: (станом на 27 листопада 2013 р.)

  1. API файлової системи (Chrome / Firefox Extension polyfill)
  2. Adobe Flash SWF Filewriter (резервна версія старих браузерів)
  3. BlobBuilder (IE10 / IE11)
  4. Розширення MEGA Firefox (застаріле)
  5. Arraybuffer / Blob (в пам’яті) + a [завантажити] (для браузерів, що підтримують [завантажити])
  6. MediaSource (експериментальне потокове рішення)
  7. Blob, що зберігається в сховищі IndexedDB + a [завантаження] (Firefox 20+, покращення в порівнянні з методом Blob в пам'яті)

(джерело: https://eu.static.mega.co.nz/js/download_6.js )


але я думаю, що це працює і на firefox. я знайшов зразок тут jsfiddle.net/kGLnP/5 . цей зразок правильно працює на chrome та firefox. але що вони роблять для інших браузерів, таких як сафарі чи опера? я також можу завантажити посилання mega.co.nz із цими браузерами ..
Амір Молаа,

1
Так, зразок, який ви надали ( jsfiddle.net/kGLnP/5 ), повинен працювати для Firefox, але лише найновіші (версія 20 або пізніша, див. Developer.mozilla.org/en-US/docs/HTML/Element/a для більше інформації про підтримку). Я щойно прочитав код JavaScript Mega та оновив свою відповідь. (Це дасть відповідь на ваше запитання щодо інших браузерів. В основному, вони вдаватимуться до використання флеш-пам’яті, коли не можуть використовувати рішення лише для JS.)
Роберто

Ого, я щойно побачив цей сайт учора і збирався задати те саме питання. Коли я спробував завантажити ігровий мод, я був здивований, що завантаження починається відразу в браузері, показуючи мою повну швидкість !!! Я використовував FF 20.0.1.
Вел

Відповідь Роберто все ще актуальна? Я спробував завантажити великий файл з mega.co.nz у Firefox і вимкнув Flash, і він все ще працював. При спробі завантажити великий файл firefox просить схвалення зберігати більше 50 Мб, що змушує мене думати, що вони використовують indexedDB.
shacharz

1
Ні, він (насправді) не оновлений , поточний сценарій завантаження знаходиться тут: eu.static.mega.co.nz/download_46.js . Я швидко подивився, і це все-таки більш-менш ті самі трюки з деякими новими доповненнями, включаючи покращення продуктивності за допомогою кешування (з використанням IndexedDB, як ви вже здогадалися). Я оновлю свою відповідь, коли встигну прочитати код.
Роберто

4

Базова реалізація багатоголосого в браузері завантажувач з допомогою Blob і URL API , наводиться тут . Він завантажує файл на 4 одночасних запити і також показує прогрес. Зверніть увагу, що, здається, rangeзаголовок налаштування, як правило, не є гарною ідеєю щодо запитів XHR, подивіться на цю тему .

Під час завантаження:

Під час завантаження

Після завантаження:

Після завантаження

Ще однією цікавою темою буде реалізація функцій Pause / Resume від Mega. API XHR поточних браузерів не пропонує цієї можливості, тому єдиний шанс у вас - зробити кілька невеликих фрагментів, завантажуючи та відмовляючись від завантаженої частини ваших невеликих фрагментів, як це, здається, робиться і на Mega. Але fetchфункцію потокового передавання можна використовувати для цієї мети, я ще недостатньо вивчив це, але це задокументовано тут .

До речі, подивіться на ці чудові проекти:


3

MEGAcmd

Існує megacmd , офіційний інтерфейс командного рядка. Ви також можете створити його з джерел на github за адресою https://github.com/meganz/MEGAcmd

megacmd є обгорткою навколо Mega SDK, і якщо ви вирішите скомпілювати її самостійно, вам знадобляться ті самі залежності (від ubuntu), що і перелічені нижче для Mega SDK.

Детальніше про використання див. У Посібнику користувача MEGAcmd .

Мега SDK

Мега SDK, який можна скомпілювати, виконавши кроки на сторінці github . Він включає megacliутиліту, яка є інтерактивною оболонкою для синхронізації та завантаження / завантаження.

## 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

модуль python mega.py (застарілий)

Для тих, хто знайшов це питання, шукаючи справжній рецепт для завантаження посилання в текстовому режимі, ось простий скрипт python, який використовує модуль mega.py (встановіть його за допомогою sudo pip install mega.py):

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

email = '_your_megamail_@domain.com'
password = getpass.getpass(prompt='Mega password for {}:'.format(email))

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

Сценарій працює з python 2.7 і бере URL-адресу посилання mega.nz.

getpass використовується для надійного введення пароля в консоль, щоб уникнути збереження пароля в скрипті - якщо вам зручно кодувати пароль, встановіть його в рядку №7.

megatools

У більшості вікон Linux / posix ви можете встановлювати megatools зі стандартних сховищ, тобто

На ubuntu / debian:

apt install megatools

На MacOS:

brew install megatools

Після встановлення ви знайдете ряд утиліт командного рядка, серед megadlяких можна завантажувати як спільні файли, так і власні. Детальніше megadl -hдив.


0

Починаючи з 2020 року, ви можете використовувати Service Workers для плавної інтеграції власного коду із вбудованим менеджером завантажень браузера: https://developers.google.com/web/updates/2016/06/sw-readablestreams

Я також думаю, що у вас будуть такі заголовки, щоб файл можна було завантажити, а не переглянути:

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

Особисто я виявив, що цей підхід працює бездоганно в обох Google Chrome у Firefox, і я вже використовую його у виробництві.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.