javascript adobe - Descargar archivos como mega.co.nz




flash player (4)

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 comenzará la descarga dentro del navegador. ¡revisé la pestaña de la red en el elemento de inspección que descargará partes del archivo con AJAX después de que haya completado todas las partes del archivo, las guardará todas en un archivo en la computadora automáticamente!

quiero saber lo que hacen? ¿Puedes explicar o vincular algún recurso sobre descargar archivos dentro del navegador de esa manera?

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


Answers

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

Durante la descarga:

Después de la descarga:

Otro tema interesante sería la implementación de la funcionalidad Pausa / Reanudar de Mega. La API XHR de los navegadores actuales no ofrece esa capacidad, por lo que la única posibilidad que tienes es hacer múltiples descargas de pequeños tamaños y renunciar a la parte descargada de tus pequeños fragmentos, como parece que también se hace en Mega. Pero la función de transmisión de fetch se puede usar para ese fin, no exploré eso todavía pero está documentado here .

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


Mega usa varios métodos diferentes para hacer esto: (desde el 27 de noviembre de 2013)

  1. API del sistema de archivos (Polyfill de extensión de Chrome / Firefox)
  2. Adobe Flash SWF Filewriter (viejos navegadores de reserva)
  3. BlobBuilder (IE10 / IE11)
  4. Extensión de MEGA Firefox (obsoleta)
  5. Arraybuffer / Blob (en memoria) + a[download] (para navegadores compatibles con [descargar])
  6. MediaSource (solución de transmisión experimental)
  7. Blob almacenado en IndexedDB storage + a[download] (Firefox 20+, mejora sobre el método Blob en memoria)

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


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

getpass se usa para ingresar de manera segura la contraseña en la consola a fin de evitar el almacenamiento de la contraseña en la secuencia de comandos. Si se siente cómodo codificando la contraseña, configúrela en la línea 7.

La secuencia de comandos funciona con python 2.7 y toma la URL del enlace mega.nz.


Sé que este tipo de viejo, pero creo que he encontrado una solución más elegante. Tuve exactamente el mismo problema. El problema que estaba teniendo con las soluciones sugeridas era que todos requerían que el archivo se guardara en el servidor, pero no quería guardar los archivos en el servidor, ya que presentaba otros problemas (seguridad: el archivo podía acceder al archivo. usuarios no autenticados, limpieza: cómo y cuándo deshacerse de los archivos). Y al igual que usted, mis datos eran objetos JSON anidados complejos que serían difíciles de poner en un formulario.

Lo que hice fue crear dos funciones de servidor. La primera validó los datos. Si hubiera un error, sería devuelto. Si no fue un error, devolví todos los parámetros serializados / codificados como una cadena base64. Luego, en el cliente, tengo un formulario que solo tiene una entrada oculta y se publica en una segunda función de servidor. Establecí la entrada oculta a la cadena base64 y envié el formato. La segunda función del servidor decodifica / deserializa los parámetros y genera el archivo. El formulario podría enviarse a una nueva ventana o un iframe en la página y el archivo se abrirá.

Hay un poco más de trabajo involucrado, y quizás un poco más de procesamiento, pero en general, me siento mucho mejor con esta solución.

El código está en C # / MVC

    public JsonResult Validate(int reportId, string format, ReportParamModel[] parameters)
    {
        // TODO: do validation

        if (valid)
        {
            GenerateParams generateParams = new GenerateParams(reportId, format, parameters);

            string data = new EntityBase64Converter<GenerateParams>().ToBase64(generateParams);

            return Json(new { State = "Success", Data = data });
        }

        return Json(new { State = "Error", Data = "Error message" });
    }

    public ActionResult Generate(string data)
    {
        GenerateParams generateParams = new EntityBase64Converter<GenerateParams>().ToEntity(data);

        // TODO: Generate file

        return File(bytes, mimeType);
    }

en el cliente

    function generate(reportId, format, parameters)
    {
        var data = {
            reportId: reportId,
            format: format,
            params: params
        };

        $.ajax(
        {
            url: "/Validate",
            type: 'POST',
            data: JSON.stringify(data),
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            success: generateComplete
        });
    }

    function generateComplete(result)
    {
        if (result.State == "Success")
        {
            // this could/should already be set in the HTML
            formGenerate.action = "/Generate";
            formGenerate.target = iframeFile;

            hidData = result.Data;
            formGenerate.submit();
        }
        else
            // TODO: display error messages
    }






javascript flash download