• User

    [PHP]Force download - download forzato

    Salve a tutti,
    avrei bisogno di forzare il download dei miei pdf:
    Ho trovato varie guide online, che funzionano perfettamente se la cartella del download si trova nello stesso ftp, tuttavia avrei bisogno di scaricare un file che si trova
    su un altro server.
    Vi posto il codice:

    
    <?php    
    /*   
    impostiamo la cartella in cui sono presenti i file per il download   
    */ 
       
    //$dir = "download/";    
    $dir = "link al sito esterno";    
        
    /*   
    riceviamo via GET il file da scaricare  
    la funzione basename la applichiamo al fine di evitare che   
    utenti maliziosi possano eseguire percorsi nell'URL  
     */    
    $file = isset($_GET['file']) ? basename( (string) $_GET['file'] ) : '';    
        
    $path = $dir . $file;    
      
    /* eseguiamo alcuni controlli preventivi */    
    if($file==''){  
        exit('Nessun file indicato');  
        }  
    else if(!is_file($path)){    
        exit('Il file non esiste');    
        }    
    else if(!is_readable($path)){    
        exit('Il file non ha i permessi per essere scaricato');    
        }    
          
    /* otteniamo alcune info sul file */    
    $info = pathinfo( $path );    
    $extension = $info['extension']; // estensione    
    $size = filesize($path); // dimensione in byte    
    $time_file = date( 'r', filemtime( $path ) ); // time ultima modifica    
       
    /* inviamo gli opportuni headers */    
    /* alcuni di questi sono degli hack (trucchi)   
    per farlo funzionare correttamente anche su alcune versioni di IE*/    
    header('Content-Type: application/octet-stream');    
    header('Content-Disposition: attachment; filename="'. basename($path) .'"');     
    header('Content-Transfer-Encoding: binary');    
    header('Content-Length: ' . $size);    
    header('Last-Modified: ' . $time_file);    
    header('Expires: 0');    
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');    
    header('Pragma: public');    
          
    /* eliminiamo eventuale output inviato */    
    ob_clean();    
    flush();    
        
    /* leggiamo il file inviamo l'output */    
    @readfile($path) or die('SERVER ERROR!');    
    exit;    
    ?>   
    
    

    ed infine l'html:

    <a href="download.php?file=file.pdf" target="_blank">SCARICA IL FILE</a>  
    

    Mi dice sempre che il file non esiste.

    Consigli? 🙂


  • User

    Ho trovato la soluzione:
    non serve nemmeno il php, basta semplicemente utilizzare un attribute di HTML5, il tag download.

    <a href="indirizzodeldownload/anu.pdf" download="nome_che_preferisco.pdf">Scarica il Pdf!</a>

    Spero di essere stato utile 🙂


  • User

    Grazie, non lo conoscevo quell'attributo, ma è cross-browser? Mi sembra che la soluzione in PHP sia ancora la più affidabile.


  • User

    Argh!! Dannazione, ho commesso un errore base.. non ho controllato 🙂

    Attualmente funziona solo su chrome!!!

    Ho trovato un'altra opzione che devo testare (vediamo se nel pomeriggio riesco..):

    • [INDENT]<?php
      header('Content-disposition: attachment; filename=huge_document.pdf');
      header('Content-type: application/pdf');
      readfile('huge_document.pdf');
      ?>

    <a href="huge_document.php">Download my huge document (PDF)</a>[/INDENT]


  • User

    🙂 il tuo primo esempio mi sembrava buono, forse dovresti controllare il percorso del file che dichiari negli header, secondo me è un problema di directory. La logica dello script mi sembra valida.


  • User

    Si infatti.. funzionando con i files nella stessa directory non dovrebbero esserci problemi con i file all'esterno.


  • User Attivo

    puoi usare file_get_contents una sola volta per ogni link in modo da conservare in automatico una copia del file sul server (file_get_contents e poi fwrite per salvare il file), poi magari con unlink puoi rimuovere i file in modo da liberare memoria!