Come posso creare un link per il download in HTML?


224

Ho un'idea di base sull'HTML. Voglio creare il link per il download nel mio sito Web di esempio, ma non ho idea di come crearlo. Come faccio a creare un collegamento per scaricare un file anziché visitarlo?


11
Il segno di accettazione per questa domanda dovrebbe essere cambiato.
Pekka,

Risposte:


163

Questa risposta è obsoleta. Ora abbiamo l' downloadattributo . (vedi anche questo link a MDN )

Se per "collegamento per il download" si intende un collegamento a un file da scaricare, utilizzare

  <a href="http://example.com/files/myfile.pdf" target="_blank">Download</a>

la target=_blankfarà una nuova finestra del browser compare prima che il download si avvia. Quella finestra viene normalmente chiusa quando il browser scopre che la risorsa è un download di file.

Si noti che i tipi di file noti al browser (ad es. Immagini JPG o GIF) verranno generalmente aperti all'interno del browser.

Puoi provare a inviare le intestazioni giuste per forzare un download come indicato ad esempio qui . (per questo è necessario lo scripting lato server o l'accesso alle impostazioni del server).


1
perché non usare l'attributo download, se ottieni un file come un jpg, verrà scaricato, invece di aprirlo.
Ben

2
Ometti "target = '_ blank'", poiché non funzionerà in IE. L'hai nemmeno provato?
Tara,

4
@Dudeson, per favore, specifica quale "non funzionerà" e di quale versione di IE stai parlando. (Ora è sicuro usare l'approccio descritto di seguito la risposta molto più recente di TIIUNDER di seguito. Dovrebbe ottenere il segno di accettazione.)
Pekka,

2
@Sergiu la risposta ha sette anni. Non posso cancellarlo e il richiedente non ha risposto alla mia richiesta di cambiare il segno di accettazione ... niente che possiamo fare, anche se aggiungerò un link alla risposta più attuale
Pekka,

1
@Dani vedi la risposta di TIIUNDER qui sotto, che è quella corretta ora.
Pekka,

455

Nei browser moderni che supportano HTML5, è possibile:

<a href="link/to/your/download/file" download>Download link</a>

Puoi anche usare questo:

<a href="link/to/your/download/file" download="filename">Download link</a>

Ciò ti consentirà di modificare il nome del file effettivamente scaricato.


ho usato lo stesso codice per scaricare il file PFD e ho testato in tutti i browser tutti supportati ma in Safari questo codice non funziona Safari invece di scaricare il file pdf aperto in una nuova scheda.
Renish Khunt,

6
caniuse.com/#search=download%20attribute Funziona su Chrome, Edge, Firefox, Opera e sui più recenti browser Android 4.4+ e non su Internet Explorer e Safari.
Bart Verkoeijen,

Come posso fare se sto creando il collegamento in modo dinamico con un clic sul pulsante?
Nongthonbam Tonthoi,

1
@NongthonbamTonthoi non puoi usare javascript per assegnare dinamicamente l'href al tag a
akshay kishore

1
Questo non funzionerà necessariamente, poiché è limitato agli URL della stessa origine.
Nathan,

22

Oltre (o in sostituzione) <a downloadall'attributo HTML5 già menzionato,
il comportamento del download su disco del browser può essere attivato anche dalla seguente intestazione di risposta http:

Content-Disposition: attachment; filename=ProposedFileName.txt;

Questo era il modo di fare prima di HTML5 (e funziona ancora con i browser che supportano HTML5).


4
Ma ciò richiede un'implementazione lato server, giusto?
Lombas,

@Lombas sì, solo il server può impostare le intestazioni di risposta http.
Myobis,

Questa è la risposta completa? È inoltre necessario inviare un'intestazione Tipo di contenuto e leggere il file per forzare il download. Potrebbe voler e quello alla tua risposta. Risposta completa qui: stackoverflow.com/a/1465631/2757916 .
Govind Rai,

questo è perfetto per l'implementazione lato server, proprio preciso anche il tipo di contenuto. è ben supportato rispetto downloadall'attributo
william.eyidi il

9

Un collegamento per il download sarebbe un collegamento alla risorsa che si desidera scaricare. È costruito nello stesso modo in cui qualsiasi altro collegamento sarebbe:

<a href="path to resource.name of file">Link</a>

<a href="files/installer.exe">Link to installer</a>

8

Per collegarti al file, fai lo stesso di qualsiasi altro link alla pagina:

<a href="...">link text</a>

Per forzare il download delle cose anche se hanno un plugin incorporato (Windows + QuickTime = ugh), puoi usarlo nel tuo htaccess / apache2.conf:

AddType application/octet-stream EXTENSION

Grazie! questo è molto più semplice ed è a livello di server! : DI ha trovato questo link che elabora un po 'di più. Grazie. htaccess-guide.com/adding-mime-types
Joe DF

Ciò farà scaricare solo tutti i file di quel tipo. Va bene se è quello che vuoi, ma potrebbe causare adattamenti se dimentichi e desideri che un altro file di quel tipo venga visualizzato nel browser invece del download.
TecBrat,

4

Ormai questo thread è probabilmente antico, ma funziona in html5 per il mio file locale.

Per i pdf:

<p><a href="file:///........example.pdf" download target="_blank">test pdf</a></p>

Questo dovrebbe aprire il pdf in una nuova finestra e consentire di scaricarlo (almeno in Firefox). Per qualsiasi altro file, basta impostarlo come nome file. Per immagini e musica, tuttavia, vorrai memorizzarli nella stessa directory del tuo sito. Quindi sarebbe come

<p><a href="images/logo2.png" download>test pdf</a></p>

2

L'attributo download non funziona in IE, ignora completamente il "download". Il download non funziona su Firefox se l'href punta a un sito remoto. Quindi l'esempio di Odin non funziona su Firefox 41.0.2.


1

C'è un'altra sottigliezza che può aiutare qui.

Voglio avere collegamenti che consentano sia la riproduzione e la visualizzazione nel browser sia uno per il semplice download. Il nuovo attributo di download va bene, ma non funziona sempre perché la coazione del browser a riprodurre o visualizzare il file è ancora molto forte.

MA .. questo si basa sull'esame dell'estensione sul nome file dell'URL! Non vuoi giocherellare con la mappatura dell'estensione del server perché vuoi consegnare lo stesso file in due modi diversi. Quindi, per il download, puoi ingannarlo collegando il file a un nome che è opaco per questa mappatura di estensione, puntandolo ad esso e quindi usando la funzione di ridenominazione del download per correggere il nome.

<a target="_blank" download="realname.mp3" href="realname.UNKNOWN">Download it</a>
<a target="_blank" href="realname.mp3">Play it</a>

Speravo solo di lanciare una query fittizia alla fine o altrimenti offuscare l'estensione avrebbe funzionato, ma purtroppo non funziona.


0

L'attributo download è nuovo per il <a>tag in HTML5

<a href="http://www.odin.com/form.pdf" download>Download Form</a>
o
<a href="http://www.odin.com/form.pdf" download="Form">Download Form</a>

Preferisco il primo è preferibile rispetto a qualsiasi estensione.


0

Puoi scaricare in vari modi seguendo la mia strada. Sebbene i file non possano essere scaricati a causa dell'autorizzazione 'allow-popups' non è impostata ma nel proprio ambiente, funzionerà perfettamente

<div className="col-6">
                    <a  download href="https://www.w3schools.com/images/myw3schoolsimage.jpg" >Test Download </a>
                </div>

un altro questo fallirà anche a causa di "X-Frame-Options" a "sameorigin".

<a href="https://www.w3schools.com/images/myw3schoolsimage.jpg" download>
  <img src="https://www.w3schools.com/images/myw3schoolsimage.jpg" alt="W3Schools" width="104" height="142">
</a>


-3

Come questo

<a href="www.yoursite.com/theThingYouWantToDownload">Link name</a>

Quindi un file name.jpg su un sito example.com sarebbe simile a questo

<a href="www.example.com/name.jpg">Image</a>

Il problema con quest'ultimo è che si aprirà nel browser, non sarà offerto per il download e il salvataggio.
Pekka,

9
Non funzionerà; il browser lo considererà come un collegamento relativo a ./www.example.com/name.jpg: è necessario utilizzare http://per i collegamenti assoluti con il dominio specificato.
Delan Azabani,

-7

so di essere in ritardo, ma questo è quello che ho ottenuto dopo 1 ora di ricerca

 <?php 
      $file = 'file.pdf';

    if (! file) {
        die('file not found'); //Or do something 
    } else {
       if(isset($_GET['file'])){  
        // Set headers
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=$file");
        header("Content-Type: application/zip");
        header("Content-Transfer-Encoding: binary");
        // Read the file from disk
        readfile($file); }
    }

    ?>

e per il link scaricabile ho fatto questo

<a href="index.php?file=file.pdf">Download PDF</a>

6
È terribile. Quando vedo un tale link per il download, devo resistere alla tentazione di provare index.php? File = index.php che in un'implementazione copia / incolla del tuo codice alla fine darebbe a una persona malintenzionata l'accesso al tuo database e chissà cosa.
M. Stramm

1
Cattiva idea. Innanzitutto, perché stai facendo funzionare il tuo server più del necessario. In secondo luogo, perché gli utenti possono scaricare qualsiasi file: p
José Neto,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.