2011-06-14 13 views
6

En mi proyecto que usar algo como la siguiente función para redirigir a los usuarios con el fin de descargar un archivo¿Cómo puedo saber cuándo se completa la descarga desde una URL?

function promptDownload(file){ 
     location.href = "http://example.com/downloads/"+file; 
} 

Como todos sabemos, cuando llamo a esta función, el navegador sólo se le pide un diálogo de descarga y no interrumpe mi flujo de aplicaciones. Lo que me gustaría hacer es determinar cuándo se completó o canceló esta descarga.

Debe haber algo como onLoad, onFinishedLoading, onConnectionEnd o etc. pero no pude encontrar nada.

+2

Podría estar equivocado, pero yo no te puedo creer . Si quieres tener mucho control, es posible que debas entregarlo a una aplicación silverlight/flash e insertar retrollamadas. (Eso es como redirigir al usuario a google.com y saber cuándo Google ha terminado de cargarse). - EDITAR: también puede usar un manejador de archivos del lado del servidor y un lado del cliente ajax para mantener los dos sincronizados, pero eso parece muy tedioso. –

+0

@radio: Eso es lo que hace [WeTransfer] (https://www.wetransfer.com/). – Midas

Respuesta

2

No puede determinar el progreso de la descarga si descarga el archivo de esa manera.

Si descarga el archivo con XMLHttpRequest, entonces se puede detectar eventos de carga, de error y de progreso como este:

function log(message) { 
    return function() { 
    alert(message); 
    }; 
} 

function download(file, callback) { 
    var request = new XMLHttpRequest(); 
    request.responseType = 'blob'; 
    request.open('GET', file); 
    request.addEventListener('load', log('load ' + file)); 
    request.addEventListener('error', log('error ' + file)); 
    request.addEventListener('progress', log('progress ' + file)); 
    request.addEventListener('load', function() { 
    callback(request.response); 
    }); 
    request.send(); 
} 

function save(object, mime, name) { 
    var a = document.createElement('a'); 
    var url = URL.createObjectURL(object); 
    a.href = url; 
    a.download = name; 
    a.click(); 
} 

document.querySelector('#download').addEventListener('click', function() { 
    download('test.pdf', function (file) { 
    save(file, 'application/pdf', 'test.pdf'); 
    }); 
}); 
<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="UTF-8"> 
    </head> 
    <body> 
    <button id="download">Download</button> 
    <script src="script.js"></script> 
    </body> 
</html> 
Cuestiones relacionadas