Visualizzazione risultati 1 fino 15 di 15

Discussione: [PHP] Forzare download file

  1. #1
    Guest

    Predefinito [PHP] Forzare download file

    Ciao a tutti,
    ho un problema con php. Vorrei far scaricare agli utenti un file attraverso php, ma il file (di dimensioni giuste) non viene aperto da nessun programma (errore nell'apertura del file). Ho provato con jpeg, png, gif, doc ma niente. L'unico che al momento funziona è txt.
    Utilizzo questa funzione:
    Codice PHP:
    <?php
    // Includo la connessione al database
    require('config.php');

    function
    download($path, $name = null)
    {
    //elenco dei mime types
    $mime_types = array(
    "bmp" => "image/bmp",
    "exe" => "application/octet-stream",
    "html" => "text/html",
    "ico" => "image/x-icon",
    "jpeg" => "image/jpeg",
    "png" => "image/png",
    "jpg" => "image/jpeg",
    "mov" => "video/quicktime",
    "mp3" => "audio/mpeg",
    "mp4" => "video/mpeg",
    "mpeg" => "video/mpeg",
    "mpg" => "video/mpeg",
    "txt" => "text/plain",
    "wav" => "audio/x-wav",
    "zip" => "application/zip"
    );

    //ricava l'estensione del file (senza il punto)
    $ext = substr(strrchr($path,'.'),1);

    //ricava il mime type dall'array
    $mime_type = $mime_types[$ext];

    //se non viene specificato un nome nel secondo parametro
    if($name == null){
    //ricava il nome del file
    $name = substr($path, strrpos($path,'/'),strlen($path)-strrpos($path,'/'));
    } else {
    //altrimenti usa il nome specificato e concatena l'estensione
    $name = $name.'.'.$ext;
    }

    if (
    headers_sent()) {
    echo
    'Errore : gli headers HTTP sono già stati inviati.';
    exit;
    }

    $path = realpath($path);
    //se il file non esiste
    if ($path === false || !is_file($path) || !is_readable($path)) {
    header('HTTP/1.0 204 No Content');
    exit;
    }

    $size = filesize($path);//calcola dimensione del file

    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0', false);
    header('Cache-Control: private');
    header('Pragma: no-cache');
    header("Content-Transfer-Encoding: binary");
    header("Content-type: {mime_type}");
    header("Content-length: {$size}");
    header("Content-disposition: attachment; filename=\"{$name}\"");
    readfile($path);
    exit;
    }
    ?>
    Sapreste aiutarmi? Grazie a tutti

  2. #2
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Codice PHP:
    header("Content-type: {mime_type}");
    Guarda bene, cosa manca ($)!

    Codice PHP:
    header("Content-type: {$mime_type}");

  3. #3
    Guest

    Predefinito

    Si hai ragione, ma ho copiato una vecchia versione della funzione. Avevo già corretto questo problema Non capisco proprio cosa possa essere . Grazie comunque

  4. #4
    L'avatar di matt93
    matt93 non è connesso Utente
    Data registrazione
    01-09-2008
    Messaggi
    241

    Predefinito

    Io aggiungerei anche un'strtolower()

    Codice PHP:
    //ricava l'estensione del file (senza il punto)
    $ext = strtolower(substr(strrchr($path,'.'),1));

    //ricava il mime type dall'array
    $mime_type = $mime_types[$ext];

  5. #5
    Guest

    Predefinito

    Fatto, ma non cambia niente. Ho provato un sacco di script senza risultato.... non so più che fare.

  6. #6
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Codice PHP:
    function download($file) {
    $file = realpath($file);

    if(
    headers_sent()) {
    echo
    "Headers già inviati!";
    return
    false;
    } else if(!
    file_exists($file)) {
    echo
    "Il file da scaricare è inesistente!";
    return
    false;
    }

    $mime_types = array(
    "bmp" => "image/bmp",
    "exe" => "application/octet-stream",
    "html" => "text/html",
    "ico" => "image/x-icon",
    "jpeg" => "image/jpeg",
    "png" => "image/png",
    "jpg" => "image/jpeg",
    "mov" => "video/quicktime",
    "mp3" => "audio/mpeg",
    "mp4" => "video/mpeg",
    "mpeg" => "video/mpeg",
    "mpg" => "video/mpeg",
    "txt" => "text/plain",
    "wav" => "audio/x-wav",
    "zip" => "application/zip"
    );

    $bytes = filesize($file);
    $info = pathinfo($file);
    $ext = strtolower($info["extension"]);
    $mt = isset($mime_types[$ext]) ? $mime_types[$ext] : "application/octet-stream";

    header("Content-Transfer-Encoding: binary");
    header("Content-Type: {$mt}");
    header("Content-disposition: attachment; filename=" . $info["filename"] . "." . $info["extension"]);
    header("Content-length: {$bytes}");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Pragma: public");

    return
    readfile($file);
    }
    Prova con questa funzione, per usarla:

    Codice PHP:
    download("cartella/file.estensione");

  7. #7
    Guest

    Predefinito

    grazie, ma niente da fare.. i file non vengono riconosciuti dai programmi, eccetto i txt.

  8. #8
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Nella funzione che ti ho scritto sopra, anche se l'estensione non è riconosciuta forza lo stesso il download.
    Io l'ho provata e funziona molto bene.

    Come stai usando questa funzione? La usi per file interni o esterni al tuo sito?

  9. #9
    Guest

    Unhappy

    eh la uso per file interni. I file vengono acquisiti poichè la dimensione è corretta. Sai come fare? Grazie per l'aiuto

  10. #10
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Magari un esempio e il codice della pagina in questione possono essere utili.
    Sempre se ti è possibile

  11. #11
    Guest

    Unhappy

    Il codice è questo
    Codice PHP:
    <?// Includo la connessione al database
    require('config.php');

    function
    download($file) {
    $file = realpath($file);

    if(
    headers_sent()) {
    echo
    "Headers già inviati!";
    return
    false;
    } else if(!
    file_exists($file)) {
    echo
    "Il file da scaricare è inesistente!";
    return
    false;
    }

    $mime_types = array(
    "bmp" => "image/bmp",
    "exe" => "application/octet-stream",
    "html" => "text/html",
    "ico" => "image/x-icon",
    "jpeg" => "image/jpeg",
    "png" => "image/png",
    "jpg" => "image/jpeg",
    "mov" => "video/quicktime",
    "mp3" => "audio/mpeg",
    "mp4" => "video/mpeg",
    "mpeg" => "video/mpeg",
    "mpg" => "video/mpeg",
    "txt" => "text/plain",
    "wav" => "audio/x-wav",
    "zip" => "application/zip"
    );

    $bytes = filesize($file);
    $info = pathinfo($file);
    $ext = strtolower($info["extension"]);
    $mt = isset($mime_types[$ext]) ? $mime_types[$ext] : "application/octet-stream";

    header("Content-Transfer-Encoding: binary");
    header("Content-Type: {$mt}");
    header("Content-disposition: attachment; filename=" . $info["filename"] . "." . $info["extension"]);
    header("Content-length: {$bytes}");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Pragma: public");

    return
    readfile($file);
    }

    // Se non è stata definita la variabile manda l'utente alla homepage
    if(!isset($_SESSION['login']))
    {
    header('Location: indexx.php');
    exit;
    }

    $con = mysql_connect("localhost","web01","");
    if (!
    $con)
    {
    die(
    'Could not connect: ' . mysql_error());
    }

    mysql_select_db("my_web01", $con);
    $getid=$_GET['id'];
    $result = mysql_query("SELECT * FROM upload where id='$getid'");

    while(
    $row = mysql_fetch_array($result))
    {
    $file = $row['percorso'];
    download('/membri/web01/login/doc/uploads/'.$file);
    }
    ?>
    Puoi aiutarmi? Mi faresti davvero un gran piacere. Dimmi se hai bisogno di altro :)

  12. #12
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Ma nella tabella upload, salvi più percorsi?
    Se è così partirà solo il download del primo file, dopo di chè non potrai scaricare più niente.

  13. #13
    Guest

    Predefinito

    io ho una tabella con dei record del tipo:

    6 web01 1263119612_web01.png titolo

    e ne ho una decina.... è un problema?

  14. #14
    L'avatar di mycarlo
    mycarlo non è connesso Utente attivo
    Data registrazione
    06-10-2009
    Residenza
    $this->s50
    Messaggi
    467

    Predefinito

    Certo che è un problema!
    Una volta richiamata la funzione, gli headers vengono inviati e quindi non si possono modificare.

    Puoi risolvere in vari modi, io ti consiglio di creare una pagina php, la chiami download.php che scarica un file in base al parametro file che viene passato via GET. In un altra pagina estrai i dati dalla tabella e crei i link per scaricare.

    In breve, questa è la pagina dove estrai i dati:
    Codice PHP:
    require('config.php');
    // Se non è stata definita la variabile manda l'utente alla homepage
    if(!isset($_SESSION['login']))
    {
    header('Location: indexx.php');
    exit;
    }

    $con = mysql_connect("localhost","web01","");
    if (!
    $con)
    {
    die(
    'Could not connect: ' . mysql_error());
    }

    mysql_select_db("my_web01", $con);
    $getid=$_GET['id'];
    $result = mysql_query("SELECT * FROM upload where id='$getid'");

    while(
    $row = mysql_fetch_array($result))
    {
    $file = $row['percorso'];
    echo
    "<a href=\"download.php?file={$file}\">Scarica {$file}</a><br />";
    }
    ?>
    E la pagina download.php
    Codice PHP:
    function download($file) {
    $file = realpath($file);

    if(
    headers_sent()) {
    echo
    "Headers già inviati!";
    return
    false;
    } else if(!
    file_exists($file)) {
    echo
    "Il file da scaricare è inesistente!";
    return
    false;
    }

    $mime_types = array(
    "bmp" => "image/bmp",
    "exe" => "application/octet-stream",
    "html" => "text/html",
    "ico" => "image/x-icon",
    "jpeg" => "image/jpeg",
    "png" => "image/png",
    "jpg" => "image/jpeg",
    "mov" => "video/quicktime",
    "mp3" => "audio/mpeg",
    "mp4" => "video/mpeg",
    "mpeg" => "video/mpeg",
    "mpg" => "video/mpeg",
    "txt" => "text/plain",
    "wav" => "audio/x-wav",
    "zip" => "application/zip"
    );

    $bytes = filesize($file);
    $info = pathinfo($file);
    $ext = strtolower($info["extension"]);
    $mt = isset($mime_types[$ext]) ? $mime_types[$ext] : "application/octet-stream";

    header("Content-Transfer-Encoding: binary");
    header("Content-Type: {$mt}");
    header("Content-disposition: attachment; filename=" . $info["filename"] . "." . $info["extension"]);
    header("Content-length: {$bytes}");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Pragma: public");

    return
    readfile($file);
    }

    if(isset(
    $_GET["file"])) {
    $file = str_replace(array(".", ".."), null, $_GET["file"]);
    download($file);
    }
    Ultima modifica di mycarlo : 20-01-2010 alle ore 14.34.13

  15. #15
    Guest

    Predefinito

    ma l'utente scarica un solo file! Comunque ora provo poi ti faccio sapere

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •