• User Attivo

    come forzare il download anzichè aprire il file sul browser?

    vorrei forzare il download dei file, ma quando li scarico alcuni di questi sono corrotti:

    .txt (LO APRE ma mi cancella il contenuto)
    .mpg (LO APRE correttamente)
    .mp3 (LO APRE correttamente)

    .rtf (NON LO APRE)
    .pdf (NON LO APRE)

    .doc (LO APRE ma ci mette all'interno tantissimi segni strani, praticamente è inutilizzabile)

    chiamo la pagina della funzione:

    <a href="../filesharing_files/admin_download_file.php?filename=<?=$rowfile2[file]?>"><?=$rowfile2['file']?></a>

    pagina funzione (admin_download_file.php) che si trova all'interno della directory (filesharing_files) anche i file da scaricare si trovano all'interno della directory (filesharing_files)

    [php]
    $nomefile = $_GET['filename'];

    // 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');

    // Parse Info / Get Extension
    $fsize = filesize($nomefile);
    $path_parts = pathinfo($nomefile);
    $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($nomefile)."\";" );
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".$fsize);
    ob_clean();
    flush();
    readfile( $nomefile );
    

    [/php]


  • User Attivo

    up


  • ModSenior

    Ciao prinzart,
    prova ad utilizzare semplicemente questo sistema:
    [php]
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.$name.'"');
    readfile($_GET['filename']);
    [/php]


  • User Attivo

    ho provato anche il tuo codice ma continua a darmi file corrotti.


  • User Attivo

    [PHP]

    <?php
    session_start();
    include('../inc_function.php');
    ?>

    <?php

    $idevento = $_GET['idcorsievento'];
    $idfile = $_GET['idcorsifile'];
    $idlogin = $_SESSION['idlogin'];
    $ip = $_SERVER['REMOTE_ADDR'];

    $file = $_GET['filename'];

    $sql = "INSERT INTO d_corsi_file_contatore (data, ora, ip, id_login, id_corsi_file, id_corsi_evento)
    VALUES (curdate(), curtime(), '$ip', '$idlogin', '$idfile', '$idevento')";
    mysql_query($sql, $conn) or die (mysql_error());

    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.$file.'"');
    readfile($_GET['filename']);

    ?>
    [/PHP]


  • User Attivo

    Attenzione alla sicurezza...
    Appendendo una variabile nella barra degli indirizzi del browser, si può scaricare qualsiasi file... file php compresi!
    Occorre fare opportuni controlli sulle variabili passate in GET.