collegamento immagine href download su click


180

Genero collegamenti normali come: <a href="https://stackoverflow.com/path/to/image"><img src="/path/to/image" /></a>in un'app Web.

Quando faccio clic sul collegamento, viene visualizzata l'immagine in una nuova pagina. Se si desidera salvare l'immagine, è necessario fare clic destro su di essa e selezionare "Salva con nome"

Non voglio questo comportamento, vorrei che una finestra di download venisse fuori facendo clic sul collegamento, è possibile solo con HTML o JavaScript? Come?

Altrimenti credo che dovrei scrivere uno script download.php e chiamarlo nell'href con il nome del file come parametro ...?


Ecco un modo semplice di fare usando questa classe PHP: tutorialchip.com/php-download-file-script
ven

Risposte:


239
<a download="custom-filename.jpg" href="/path/to/image" title="ImageName">
    <img alt="ImageName" src="/path/to/image">
</a>

Http://caniuse.com/#feat=download non è ancora completamente supportato , ma è possibile utilizzare con modernizr https://modernizr.com/download/?adownload-setclasses ( in Rilevamenti non core ) per verificare il supporto di il browser.


2
Grazie per il tuo commento, è una buona cosa da sapere. Anche se hai bisogno di modernizzazione, ora lo uso in tutti i miei progetti, quindi ... Accetterò la tua risposta come nuova risposta
Pierre

1
Penso che potresti aver frainteso il ruolo di Modernizr qui. In breve, non aggiunge funzionalità che manca ... vedere questa risposta: stackoverflow.com/questions/18681644/...
bravokiloecho

@GauravManral quali cuciture rappresentano il problema?
Francisco Costa,

1
@GauravManral: IE non lo supporta, come indicato nella risposta. Guarda il link caniuse fornito.
peirix,

8
IMPORTANTE : l' downloadattributo attribte funziona solo per URL della stessa origine . MDN Docs
cespon

59

Il modo più semplice per creare un collegamento per il download di immagini o HTML è impostare l' attributo di download , ma questa soluzione funziona solo nei browser moderni.

<a href="/path/to/image" download="myimage"><img src="/path/to/image" /></a>

"myimage" è un nome di file da scaricare. L'estensione verrà aggiunta automaticamente Esempio qui


Funzionerà con Windows Message Box? Ho provato, sembra non funzionare, ma forse ho fatto qualcosa di sbagliato ?!
Z77,

48
<a href="download.php?file=path/<?=$row['file_name']?>">Download</a>

download.php:

<?php

$file = $_GET['file'];

download_file($file);

function download_file( $fullPath ){

  // Must be fresh start
  if( headers_sent() )
    die('Headers Sent');

  // Required for some browsers
  if(ini_get('zlib.output_compression'))
    ini_set('zlib.output_compression', 'Off');

  // File Exists?
  if( file_exists($fullPath) ){

    // Parse Info / Get Extension
    $fsize = filesize($fullPath);
    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);

    // Determine Content Type
    switch ($ext) {
      case "pdf": $ctype="application/pdf"; break;
      case "exe": $ctype="application/octet-stream"; break;
      case "zip": $ctype="application/zip"; break;
      case "doc": $ctype="application/msword"; break;
      case "xls": $ctype="application/vnd.ms-excel"; break;
      case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
      case "gif": $ctype="image/gif"; break;
      case "png": $ctype="image/png"; break;
      case "jpeg":
      case "jpg": $ctype="image/jpg"; break;
      default: $ctype="application/force-download";
    }

    header("Pragma: public"); // required
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false); // required for certain browsers
    header("Content-Type: $ctype");
    header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";" );
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".$fsize);
    ob_clean();
    flush();
    readfile( $fullPath );

  } else
    die('File Not Found');

}
?>

17
Si è verificato un problema di sicurezza, deve essere chiuso Content-Type "application / force-download"! che può scaricare qualsiasi cosa, inclusa la fonte PHP del server!
Charles B,

3
@CharlesB ha ragione, questo ti permetterebbe di scaricare qualsiasi cosa dal server usando l'attraversamento della directory: <a href="download.php?file=../dbparams.inc>">Download</a>per esempio. Maggiori informazioni qui: en.wikipedia.org/wiki/Directory_traversal_attack
OrganicPanda

@CharlesB: qual è il modo più sicuro ... tranne la risposta barrata ??
HIRA THAKUR,

3
Per aggirare il problema di sicurezza, non prendere informazioni sul percorso assoluto o relativo dalla richiesta; ottieni solo il nome del file. Rimuovere il percorso, ad esempio utilizzando $ file = pathInfo ($ _ GET ['file'] e quindi assemblare il percorso aggiungendo un percorso noto con $ file ['basename']. Se è necessario fornire file da varie cartelle, utilizzare i token di percorso nella tua richiesta, che poi associ al percorso effettivo nella tua funzione di download.
Alexander233

1
Oppure crea una tabella con relazione Id, Token, Path, ottieni il token dall'URL, controlla il Path nel database e restituisci quel file. Sarebbe più sicuro. Ma ovviamente più complicato.
Felype,

10

No, non lo è. Sarà necessario qualcosa sul server per inviare un'intestazione Content-Disposition per impostare il file come allegato anziché essere in linea. Puoi farlo con la semplice configurazione di Apache.

ho trovato un esempio di come farlo usando mod_rewrite , anche se so che esiste un modo più semplice.


6
Ehi, dici: "anche se so che esiste un modo più semplice" ... quale? ^ _ ^
Pierre

Se potessi trovare i dettagli, li pubblicherei. Non riesco a trovarli in questo momento e non ho tempo da dedicare a una ricerca approfondita.
Quentin

1
Va bene grazie per il tuo aiuto. Ho appena creato una pagina php che genera il download ...
Pierre


7

Prova questo...

<a href="/path/to/image" download>
    <img src="/path/to/image" />
 </a>

5

Attributo di download HTML per specificare che la destinazione verrà scaricata quando un utente fa clic sul collegamento ipertestuale.

Questo attributo viene utilizzato solo se è impostato l'attributo href.

Il valore dell'attributo sarà il nome del file scaricato. Non ci sono restrizioni sui valori consentiti e il browser rileverà automaticamente l'estensione del file corretta e la aggiungerà al file (.img, .pdf, .txt, .html, ecc.).

Codice di esempio:

<a href="https://www.w3schools.com/images/myw3schoolsimage.jpg"> Download Image >></a>

HTML5:

<a href="https://www.w3schools.com/images/myw3schoolsimage.jpg" download> Download Image >></a>

Uscita :

Scarica immagine >>

Download HTML5 o Chrome

Scarica immagine >>


1
Ehi, grazie per la risposta. Alcune persone lo hanno già proposto, ma penso che non sia ancora pienamente supportato. D'altra parte, il tuo link per il download non funziona per me sull'ultimo Chrome
Pierre

Ehi Pierre, prova questo <a href=" w3schools.com/images/myw3schoolsimage.jpg "download> Scarica immagine >> </a> grazie
Rizo

4

Non puoi farlo con puro HTML / JavaScript. Questo perché hai una connessione separata al server web per recuperare un file separato (l'immagine) e un server web normale servirà il file con le intestazioni del contenuto impostate in modo che il browser che legge il tipo di contenuto decida che il tipo può essere gestito internamente.

Il modo per forzare il browser a non gestire il file internamente è quello di modificare le intestazioni (preferibilmente la disposizione del contenuto o il tipo di contenuto) in modo che il browser non proverà a gestire il file internamente. Puoi farlo scrivendo uno script sul server web che imposta dinamicamente le intestazioni (ad esempio download.php) o configurando il server web per restituire diverse intestazioni per il file che vuoi scaricare. Puoi farlo su una base per directory sul server web, che ti permetterebbe di scappare senza scrivere php o javascript - semplicemente avere tutte le tue immagini di download in quella posizione.


1
No. Mentire sul tipo di contenuto non è l'unico modo per raggiungere questo obiettivo. Vedi l'intestazione della risposta HTTP per la disposizione del contenuto.
Quentin

4

Codice semplice per il download di immagini con un'immagine che fa clic con php

<html>
<head>
    <title> Download-Button </title>
</head>
<body>
    <p> Click the image ! You can download! </p>
    <?php
    $image =  basename("http://localhost/sc/img/logo.png"); // you can here put the image path dynamically 
    //echo $image;
    ?>
    <a download="<?php echo $image; ?>" href="http://localhost/sc/img/logo.png" title="Logo title">
        <img alt="logo" src="http://localhost/sc/img/logo.png">
    </a>
</body>

2

Download dell'immagine con l'utilizzo del clic dell'immagine!

Ho fatto questo semplice codice! :)

<html>
<head>
<title> Download-Button </title>
</head>
<body>
<p> Click the image ! You can download! </p>
<a download="logo.png" href="http://localhost/folder/img/logo.png" title="Logo title">
<img alt="logo" src="http://localhost/folder/img/logo.png">
</a>
</body>
</html>
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.