Téléchargez des fichiers comme mega.co.nz

89

Aujourd'hui, j'ai vérifié mega.co.nz et je suis enthousiasmé par certaines fonctionnalités. Par exemple, sur la page de téléchargement, il téléchargera les fichiers sur le navigateur et les décryptera ensuite avec javascript.

par exemple voir ce lien pour télécharger un fichier png:

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

dans ce lien, le téléchargement démarre dans le navigateur. J'ai vérifié l'onglet réseau dans l'élément inspect, il téléchargera des parties du fichier avec AJAX après avoir terminé toutes les parties du fichier, les enregistrera toutes dans un fichier sur l'ordinateur automatiquement!

je veux savoir ce qu'ils font? pouvez-vous expliquer ou créer un lien vers une ressource sur le téléchargement de fichiers dans le navigateur comme ça?

peut également le faire uniquement avec javascript ou devrait utiliser des plugins flash ou quelque chose comme ça?

Amir Molaa
la source
3
Ouais, et si vous téléchargez un fichier volumineux, le système ralentit jusqu'à l'exploration à cause de la pagination constante
kinokijuf

Réponses:

102

Mega utilise plusieurs méthodes différentes pour ce faire: (au 27 novembre 2013)

  1. API du système de fichiers (polyfill d'extension Chrome / Firefox)
  2. Adobe Flash SWF Filewriter (ancien navigateur de secours)
  3. BlobBuilder (IE10 / IE11)
  4. Extension MEGA Firefox (obsolète)
  5. Arraybuffer / Blob (en mémoire) + un [téléchargement] (pour les navigateurs prenant en charge un [téléchargement])
  6. MediaSource (solution de streaming expérimentale)
  7. Blob stocké dans le stockage IndexedDB + un [téléchargement] (Firefox 20+, amélioration par rapport à la méthode Blob en mémoire)

(source: https://eu.static.mega.co.nz/js/download_6.js )

Roberto
la source
mais je pense que cela fonctionne aussi sur Firefox. J'ai trouvé un échantillon ici jsfiddle.net/kGLnP/5 . cet exemple fonctionne correctement sur Chrome et Firefox. mais que font-ils pour les autres navigateurs comme safari ou opéra? Je peux aussi télécharger des liens mega.co.nz avec ces navigateurs.
Amir Molaa
1
Oui, l'exemple que vous avez fourni ( jsfiddle.net/kGLnP/5 ) devrait fonctionner pour Firefox, mais uniquement les derniers (version 20 ou ultérieure, voir developer.mozilla.org/en-US/docs/HTML/Element/a pour plus d'infos sur les supports). Je viens de lire le code JavaScript de Mega et j'ai mis à jour ma réponse. (Cela répondra à votre question sur les autres navigateurs. Fondamentalement, ils auront recours à l'utilisation de flash lorsqu'ils ne peuvent pas utiliser des solutions JS uniquement.)
roberto
Wow, je viens de voir ce site hier et j'allais poser la même question. Lorsque j'ai essayé de télécharger un mod de jeu, j'ai été surpris que le téléchargement démarre immédiatement dans le navigateur, affichant ma vitesse maximale !!! J'utilisais FF 20.0.1.
Wel
La réponse de Roberto est-elle toujours à jour? J'ai essayé de télécharger un gros fichier de mega.co.nz dans Firefox et j'ai désactivé le flash et cela fonctionnait toujours. En essayant de télécharger un gros fichier, Firefox demande l'autorisation de stocker plus de 50 Mo, ce qui me fait penser qu'ils utilisent indexedDB.
shacharz
1
Non, il n'est pas (vraiment) à jour, le script de téléchargement actuel est ici: eu.static.mega.co.nz/download_46.js . J'ai jeté un coup d'œil et c'est toujours plus ou moins les mêmes astuces avec quelques nouveaux ajouts, y compris des améliorations de performances par mise en cache (en utilisant IndexedDB, comme vous l'avez deviné). Je mettrai à jour ma réponse lorsque j'aurai le temps de lire le code.
roberto
4

Une implémentation de base du téléchargeur dans le navigateur en plusieurs parties à l'aide des API Blob et URL est présentée ici . Il télécharge un fichier sur 4 requêtes simultanées et montre également la progression. Veuillez noter qu'il semble que la définition de l'en- rangetête n'est généralement pas une bonne idée pour les demandes XHR, jetez un œil à cette rubrique .

Pendant le téléchargement:

Pendant le téléchargement

Après le téléchargement:

Après le téléchargement

Un autre sujet intéressant serait la mise en œuvre de la fonctionnalité Pause / Reprise de Mega. L'API XHR des navigateurs actuels n'offre pas cette capacité, donc la seule chance que vous avez est de télécharger plusieurs morceaux de petite taille et d'abandonner la partie téléchargée de vos petits morceaux, comme cela semble se faire sur Mega également. Mais fetchla fonctionnalité de streaming peut être utilisée à cette fin, je n'ai pas encore suffisamment exploré cela, mais elle est documentée ici .

Btw, jetez un œil à ces projets impressionnants:

Ebrahim Byagowi
la source
3

MEGAcmd

Il y a megacmd , l'interface de ligne de commande officielle. Vous pouvez également le construire à partir de sources sur github à https://github.com/meganz/MEGAcmd

megacmd est un wrapper autour de Mega SDK et si vous décidez de le compiler vous-même, vous aurez besoin des mêmes dépendances (sur ubuntu) que celles répertoriées ci-dessous pour Mega SDK.

Pour plus de détails sur l'utilisation, consultez le Guide de l'utilisateur MEGAcmd .

Mega SDK

Mega SDK qui peut être compilé en suivant les étapes de la page github . Il comprend l' megacliutilitaire qui est un shell interactif pour la synchronisation et le téléchargement / téléchargement.

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

module python mega.py (obsolète)

Pour ceux qui ont trouvé cette question à la recherche d'une recette réelle pour télécharger un lien en mode texte, voici un simple script python qui utilise le module mega.py (installez-le avec 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])

Le script fonctionne avec python 2.7 et prend l'URL du lien mega.nz.

getpass est utilisé pour entrer le mot de passe en toute sécurité dans la console afin d'éviter de stocker le mot de passe dans le script - si vous êtes à l'aise pour coder le mot de passe en dur, définissez-le à la ligne 7.

megatools

Sur la plupart des boîtiers Linux / posix, vous pouvez installer des megatools à partir de référentiels standard, c'est-à-dire

Sur ubuntu / debian:

apt install megatools

Sur MacOS:

brew install megatools

Une fois installé, vous trouverez un certain nombre d'utilitaires de ligne de commande, parmi megadllesquels vous pouvez télécharger à la fois des fichiers partagés et vos propres fichiers. Voir megadl -hpour plus de détails.

ccpizza
la source
0

À partir de 2020, vous pouvez utiliser les Service Workers pour intégrer de manière transparente votre code personnalisé avec le gestionnaire de téléchargement intégré du navigateur: https://developers.google.com/web/updates/2016/06/sw-readablestreams

Je suppose également que vous auriez les en-têtes suivants pour qu'un fichier soit téléchargé au lieu d'être affiché:

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

Personnellement, j'ai trouvé que cette approche fonctionnait parfaitement dans Google Chrome et Firefox, et je l'utilise déjà en production.

vdudouyt
la source