2010-07-02 20 views
6

Il problema di base è questo: ho un collegamento a un file immagine. Il comportamento desiderato quando clicco sul link è di ottenere la finestra di download che mi permetterebbe di avviare un editor di immagini associato. Questo non succede perché il file immagine è reso dal browser.tag di download html

C'è qualche magia html che posso utilizzare per forzare il browser a offrire una finestra di dialogo di download quando l'utente fa clic su un collegamento?

Qualsiasi aiuto o suggerimento sarebbe molto apprezzato.

risposta

3

Due approachs:

  1. Uso Data URIs nel href di un tag di ancoraggio:

    <a href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAPCAYAAADphp8SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOnAAADpwBB5RT3QAAABZ0RVh0Q3JlYXRpb24gVGltZQAwMi8yNS8xMapAVMwAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAABjklEQVQ4jZWTwWoTURSGv5lMp1OmxUIUXISCCbW06daNtGuh7uMbCHaeoOBSzBMEN92LXXThohVtoAshOyuKJQkaXWRjKi7aBjPT9v6uEsbpTGp/OHDPvf/5zjmLa0niCo0zWMODA2BZVqZTEkG1RdwhoLaxMKqTBJKWJO1JOpN0Iek8EQqeNxVXLP8jqS7pniXpe+1V9+yw058ft19yoqHKJb+9XikcOcDcYadvj4Mki+P68q1/F5hz4s1qGwsABNUWszMOD+7nWS75THk5wshw0DzhbeM3x/3zJG/CiWdBtTU6r63kuZ2f5NnmD8LI4Lk2TyoFHq7mefnm56XJMldaLE5T2+oSRgaAQWR4sdWlXJpO9WeCbvi5EWSoQWSYmkwvyQRdGOG5/z57rn0JfiWo8emY4FFhBPNcm/VKgQ/Nk1S/k3oLvN4/Ym31Jk8f38FzbQah4fPXU3be/8oEGSCXfBhEhu16j+16L6tXXKENfFwq+u3/caepXPLbwDsk3ZK0G/tr14lTSTuSin8BUMr8td343bwAAAAASUVORK5CYII=">Download</a>

  2. In alcuni browser specifici, come Google Chrome e Firefox, si può fare:

    <a download="image.jpg" href="http://www.domain.com/image.jpg">Download</a>

0

Non possibile con solo HTML, tuttavia è possibile forzare il download del file modificando le intestazioni con un linguaggio lato server come PHP.


// grab the requested file's name 
$file_name = $_GET['file']; 

// make sure it's a file before doing anything! 
if(is_file($file_name)) 
{ 

    /* 
     Do any processing you'd like here: 
     1. Increment a counter 
     2. Do something with the DB 
     3. Check user permissions 
     4. Anything you want! 
    */ 

    // required for IE 
    if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); } 

    // get the file mime type using the file extension 
    switch(strtolower(substr(strrchr($file_name,'.'),1))) 
    { 
     case 'pdf': $mime = 'application/pdf'; break; 
     case 'zip': $mime = 'application/zip'; break; 
     case 'jpeg': 
     case 'jpg': $mime = 'image/jpg'; break; 
     default: $mime = 'application/force-download'; 
    } 
    header('Pragma: public'); // required 
    header('Expires: 0');  // no cache 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($file_name)).' GMT'); 
    header('Cache-Control: private',false); 
    header('Content-Type: '.$mime); 
    header('Content-Disposition: attachment; filename="'.basename($file_name).'"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Content-Length: '.filesize($file_name)); // provide file size 
    header('Connection: close'); 
    readfile($file_name);  // push it out 
    exit(); 

} 
+0

Ma questo significa che semplicemente navigando su questa pagina l'utente sarà costretto a scaricare l'immagine? –

+0

No, quello che dovresti fare è cambiare il link dell'immagine per puntare a questo file php che invia via $ _GET ['file'] dove si trova l'immagine. e quindi sì il file sarà forzato a scaricare – Brady

+0

È mediawiki, quindi non sono sicuro di poter facilmente manipolare le intestazioni http dal contesto di un'estensione mediawiki –

0

se si vuole presentarsi finestra di download, è necessario mettere intestazioni speciali per la vostra immagine

in PHP sarà:

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename=image.jpg'); 
header('Content-Transfer-Encoding: binary'); 
-1

Un'altra soluzione potrebbe essere quella di aggiungere questo ai un file .htaccess nella cartella con le immagini:

AddType application/octet-stream .jpg

+0

Non forzerebbe tutti i file jpg a essere trattati come binari raw ?, Mi piacerebbe essere in grado di visualizzare anche le immagini nel browser ... –

+0

sì, imporrebbe il download di tutte le immagini. Con questa soluzione metti le immagini che vuoi scaricare forzatamente in una cartella separata e applica questo codice solo a quella cartella. Se non puoi farlo per qualsiasi motivo, allora una soluzione PHP o simile è l'unico modo. – Brady