Descarga archivos como mega.co.nz

89

Hoy revisé mega.co.nz y estoy entusiasmado con algunas características. Por ejemplo, en la página de descarga, descargará archivos en el navegador y luego los descifrará con javascript.

por ejemplo, vea este enlace para descargar un archivo png:

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

en este enlace iniciará la descarga dentro del navegador. Revisé la pestaña de red en el elemento de inspección, descargará partes del archivo con AJAX después de completar todas las partes del archivo, ¡las guardará todas en un archivo en la computadora automáticamente!

quiero saber que hacen ¿Puede explicar o vincular a algún recurso sobre la descarga de archivos dentro del navegador como ese?

También puede hacerlo solo con javascript o debería usar algunos complementos flash o algo así?

Amir Molaa
fuente
3
Sí, y si descarga un archivo grande, el sistema se ralentiza debido a la paginación constante
kinokijuf

Respuestas:

102

Mega utiliza varios métodos diferentes para hacer esto: (a 27 de noviembre de 2013)

  1. API del sistema de archivos (polyfill de extensión de Chrome / Firefox)
  2. Adobe Flash SWF Filewriter (respaldo de navegadores antiguos)
  3. BlobBuilder (IE10 / IE11)
  4. Extensión MEGA Firefox (obsoleta)
  5. Arraybuffer / Blob (en memoria) + una [descarga] (para navegadores que admiten una [descarga])
  6. MediaSource (solución de transmisión experimental)
  7. Blob almacenado en el almacenamiento IndexedDB + una [descarga] (Firefox 20+, mejora con respecto al método Blob en memoria)

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

roberto
fuente
pero creo que también funciona en Firefox. Encontré una muestra aquí jsfiddle.net/kGLnP/5 . esta muestra funciona correctamente en Chrome y Firefox. pero, ¿qué hacen para otros navegadores como safari u opera? también puedo descargar enlaces de mega.co.nz con estos navegadores ..
Amir Molaa
1
Sí, la muestra que proporcionó ( jsfiddle.net/kGLnP/5 ) debería funcionar para Firefox, pero solo las últimas (versión 20 o posterior, consulte developer.mozilla.org/en-US/docs/HTML/Element/a para más información sobre soportes). Acabo de leer el código JavaScript de Mega y actualicé mi respuesta. (Responderá a su pregunta sobre otros navegadores. Básicamente, recurrirán al uso de flash cuando no puedan usar soluciones exclusivas de JS.)
roberto
Vaya, acabo de ver este sitio ayer e iba a hacer la misma pregunta. Cuando intenté descargar un mod de juego, me sorprendió que la descarga se iniciara inmediatamente dentro del navegador y mostrara mi velocidad máxima. Estaba usando FF 20.0.1.
Wel
¿Sigue actualizada la respuesta de Roberto? Intenté descargar un archivo grande de mega.co.nz en Firefox y deshabilité el flash y aún funciona. Cuando intento descargar un archivo grande, Firefox solicita aprobación para almacenar más de 50 MB, lo que me hace pensar que usan indexedDB.
shacharz
1
No, no está (realmente) actualizado, el script de descarga actual está aquí: eu.static.mega.co.nz/download_46.js . Eché un vistazo rápido y todavía son más o menos los mismos trucos con algunas adiciones nuevas, incluidas mejoras de rendimiento mediante el almacenamiento en caché (usando IndexedDB, como habrás adivinado). Actualizaré mi respuesta cuando tenga tiempo de leer el código.
roberto
4

Aquí se presenta una implementación básica del descargador multiparte en el navegador que utiliza Blob y API de URL . Descarga un archivo en 4 solicitudes simultáneas y también muestra el progreso. Tenga en cuenta que, en general, parece que configurar el rangeencabezado no es una buena idea para las solicitudes XHR, eche un vistazo a este tema .

Durante la descarga:

Mientras descarga

Después de la descarga:

Después de la descarga

Otro tema interesante sería la implementación de la funcionalidad Pause / Resume de Mega. La API XHR de los navegadores actuales no ofrece esa capacidad, por lo que la única posibilidad que tiene es descargar varios fragmentos pequeños y renunciar a la parte descargada de sus fragmentos pequeños, como parece que también se hace en Mega. Pero fetchla función de transmisión se puede usar para ese propósito, todavía no lo exploré lo suficientemente bien, pero está documentado aquí .

Por cierto, eche un vistazo a estos increíbles proyectos:

Ebrahim Byagowi
fuente
3

MEGAcmd

Existe megacmd , la interfaz de línea de comandos oficial. También puede compilarlo a partir de fuentes en github en https://github.com/meganz/MEGAcmd

megacmd es un envoltorio de Mega SDK y si decide compilarlo por su cuenta, necesitará las mismas dependencias (en ubuntu) que las que se enumeran a continuación para Mega SDK.

Para obtener detalles sobre el uso, consulte la Guía del usuario de MEGAcmd .

Mega SDK

Mega SDK que se puede compilar siguiendo los pasos de la página de github . Incluye la megacliutilidad que es un shell interactivo para sincronizar y descargar / cargar.

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

módulo python mega.py (obsoleto)

Para aquellos que encontraron esta pregunta buscando una receta real para descargar un enlace en modo texto, aquí hay un script de Python simple que usa el módulo mega.py (instálelo con 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])

El script funciona con python 2.7 y toma la URL del enlace mega.nz.

getpass se usa para ingresar de forma segura la contraseña en la consola a fin de evitar almacenar la contraseña en el script; si se siente cómodo codificando la contraseña, configúrela en la línea # 7.

megatools

En la mayoría de las cajas Linux / posix puede instalar megatools desde repositorios estándar, es decir

En ubuntu / debian:

apt install megatools

En MacOS:

brew install megatools

Una vez instalado, encontrará una serie de utilidades de línea de comandos, entre las megadlcuales puede descargar tanto archivos compartidos como sus propios archivos. Consulte megadl -hpara obtener más detalles.

ccpizza
fuente
0

A partir de 2020, puede utilizar Service Workers para integrar sin problemas su código personalizado con el administrador de descargas integrado del navegador: https://developers.google.com/web/updates/2016/06/sw-readablestreams

También supongo que tendría los siguientes encabezados para que se descargue un archivo en lugar de verlo:

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

Personalmente, he descubierto que este enfoque funciona perfectamente tanto en Google Chrome como en Firefox, y ya lo estoy usando en producción.

vdudouyt
fuente