Download di file tramite Ajax

IImanuII

Utente Attivo
10 Giu 2012
390
0
16
Salve ragazzi,
Avete presente il sito www.mega.co.nz ? Bene, vorrei sapere come "replicare" il tipo di download.
Vorrei creare una pagina che mi faccia scaricare il file direttamente premendo download. Se non erro scarica i file in cache e poi li fa scaricare sul pc. Sapete aiutarmi?
 
Ho dato un occhiata allo script per il download che usa mega.
Non è una soluzione veloce o facile da realizzare in quanto utilizza davvero differenti tecnologie, alcune molto recenti (come le api filesystem, per dirne una) e prevede un fallback in flash per i vecchi browser che non ne hanno supporto.

Se quello che ti preme è sapere la percentuale di avanzamento del download, allora ti direi di dare un occhio ad XmlHttpRequest 2, in particolare all'evento onprogress tramite cui puoi gestire ad esempio una barra di caricamento visiva per informare l'utente dello status del download. (Il problema rimangono sempre i browser che non hanno supporto a questa tecnologia e dovresti prevedere qualche tipo di soluzione alternativa)
 
Grazie per la risposta :D
No in realtà quello che mi preme è far si che il download avvenga prima in cache e poi che il browser lo "sposti". Non mi interessa che funzioni su tutti i browser, ma solo su chrome :) al massimo con PHP riconosco il browser che utilizzano e se non è chrome li avviso.

Inviato dal mio Nexus 4 con Tapatalk 4
 
Ultima modifica:
Allora, per fare quella cosa lì mega scarica i dati accumulandoli in forma binaria grazie ad ArrayBuffer, dopo si avvale del nuovo attributo download disponibile per i tag anchor.

Credo sia la preparazione del browser che legge il contenuto (per piccoli file dovrebbe essere istantaneo il processo) dal tag anchor con l'attributo donwload che lo mette in condizione di eseguire un secondo processamento delle informazioni a download concluso.
 
OK più o meno ti seguo teoricamente ma non ho idea di come metterla in pratica, è complicato scrivere un codice d'esempio?

Inviato dal mio Nexus 4 con Tapatalk 4
 
Appena riesco ci provo, concettualmente l'ho chiaro: nella pratica è una cosa che non ho mai provato.
 
Ciao, ho fatto una prova come promesso.
In larga parte è merito del mozilla developer network, che fornisce una serie di infomazioni ed esempi molto interessanti per passare tramite Ajax del contenuto in formato binario.

A quel punto è stato facile applicare il concetto dell'attributo download dell'anchor come ti ho scritto.
Il risultato (che funziona con buona parte dei browser più recenti) è il seguente:
HTML:
<!DOCTYPE HTML>
<html>
<head><title>Ajax Binary Download</title></head>
<body>

<a href="#" id="downloadme">Download File</a>
 
<script>

function download(resource) {
    var a = document.getElementById('downloadme');
    
    var oReq = new XMLHttpRequest();
    oReq.open("GET", resource, true);
    oReq.responseType = "arraybuffer";
    
    resource = resource.split('/');
    var fileName = resource[resource.length-1];

    oReq.onload = function() {
        var blob = new Blob([oReq.response], {type: "image/png"});
        var url = window.URL.createObjectURL(blob);
        
        a.href = url;
        a.download = fileName;
    };

    oReq.send();
}

download('/imgs/image.png');
</script>
</body>
</html>

Due considerazioni, anzi tre:
1. Devi implementare qualche controllo per riconoscere il mime type adeguato del file che ti prefiggi di scaricare, nel mio caso lo scopo dell'esempio era dimostrare la fattibilità del download quindi ho scritto manualmente "image/png".

2. Ovviamente lo script così com'è manca di tutta una serie di controlli preparatori. Ad esempio se scarichi un file voluminoso il download sul link potrebbe non essere pronto prima di un tot di tempo.

3. Restando in tema di file molto voluminosi questo metodo non effettua uno streaming delle informazioni, se vuoi passare files di centinaia di megabyte in questo modo devi dividere il download del file binario in più parti che poi devi ricomporre con javascript prima di infilarlo nell'anchor.


Spero l'esempio ti sia d'aiuto :)
 
Ciao, grazie è uno splendido regalo di compleanno!! (Si, oggi faccio ben 26 anni!) Armeggeró nei giorni seguenti per implementarlo con i suggerimenti che mi hai dato. Nel caso avessi problemi, posso ripostare qui? Grazie ancora!!

Inviato dal mio Nexus 4 con Tapatalk 4
 
Ciao, grazie è uno splendido regalo di compleanno!! (Si, oggi faccio ben 26 anni!) Armeggeró nei giorni seguenti per implementarlo con i suggerimenti che mi hai dato. Nel caso avessi problemi, posso ripostare qui? Grazie ancora!!

Inviato dal mio Nexus 4 con Tapatalk 4

Accipicchia, auguri allora!
Visto che tecnicamente è sempre lo stesso problema, direi che usare questa discussione come riferimento in caso tu debba postare novità o chiedere altri consigli possa andare.

Unica nota è che io personalmente temo che, per seguirti, in caso, mi ritrovi costretto a dover fare delle prove e dei test e per cui, in quel caso, ti chiederei molta pazienza in quanto il mio tempo libero non è molto.

Soltanto ti consiglio di contattare un moderatore e sistemare due cose: uno il titolo del topic sarebbe più appropriato se descritto come "Download dati binary con Ajax" (o qualcosa di simile); secondo, la discussione andrebbe spostata nel forum javascript > Ajax.
 
Ho fatto richiesta a borgo in mp :) E' sempre molto disponibile quando lo legge sicuramente sposterà il topic xD
 
Adesso che è nelle mie facoltà ci ho pensato io ;)

Ma ti hanno dato i superpoteri?? :DD

Comunque lo script funziona egregiamente grazie!

Una pignoleria, se volessi implementare la progress bar posso utilizzare l'evento onprogress?

Se mi dici che è complessa come cosa non ci provo nemmeno, però ho già pronto il piano b: al click del bottone download faccio apparire uno "sfondo" trasparente (tipo quelli anti adblock hai presente?) con al centro scritto "Attendere preparazione del download in corso.." così almeno l'utente finale non risulta spiazzato. ;P

Che dici, è complesso l'utilizzo di onprogress? Mi conviene direttamente passare al piano b?
 

Discussioni simili