Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Forzare browser: header Content-Disposition

    Buongiorno a tutti,
    ho inserito all'interno di una pagina html ( http://www.ellissinelcerchio.net/musica.html ) i path di alcuni file in formato mp3 e ogg in modo da poter consentire agli utenti il download degli stessi.
    I link ai file audio non sono diretti ma filtrati da uno script in php per il conteggio dei click.

    Poichè desidererei che l'utente potesse salvare comodamente i file audio attraverso una finestra di dialogo, per evitare di aprire i file all'interno della finestra di un browser (che abbia ad esempio installato un plugin per la riproduzione audio) ho pensato di segnalare agli utenti di eseguire le seguente operazione:

    click destro -> salva oggetto con nome

    Con explorer non ho riscontrato alcun problema.
    Tramite firefox invece il nome del file audio visualizzato all'interno della finestra di dialogo "save" non è il nome originale del file mp3/ogg bensì è "click.php4.mp3/ogg" dove click.php4 è il nome della pagina contenete lo script per il conteggio dei click.
    Il file comunque cambia solo il nome non il contenuto infatti una volta salvato e mandato in esecuzione si è dimostrato essere il file audio corretto.

    Mi sono documentato e ho scoperto che tramite l'header Content-Disposition posso forzare il browser a mostrare la finestra di dialogo save:

    codice:
    <?php
    header("Content-type: application/pdf");
    header("Content-Disposition: attachment; filename=downloaded.pdf");
    
    /* ... manda in output un file pdf ... */
    Quest'esempio (che ho trovato qui: http://it.php.net/manual/it/function.header.php ) riguarda però file in formato solo .pdf il mio problema è che all'interno della pagina click.php4 dovrei gestire due formati diversi: mp3 e ogg, non uno solo.

    1 - come è possibile gestire due diversi formati?
    2 - può essere utile a risolvere il problema della sostituzione del nome del file originale riscontrato in firefox?

    Grazie anticipatamente per la risposta
    Ciao
    Luca

  2. #2

  3. #3

    [PHP] forzare browser: funzione forceDownload

    Grazie, alcune considerazioni:

    1 - alla pagina http://www.ellissinelcerchio.net/musica.html cliccando ad esempio sul link http://www.opkitchen.org/click.php4?...terferenze.ogg si passa attraverso il contatore (click.php4) installato su www.opkitchen.org. L'url che fa incrementare il contatore in questo caso è: http://www.ellissinelcerchio.net/dow...terferenze.ogg

    2 - se inserisco e richiamo la funzione forceDownload nel file click.php4 devo a questo punto eliminare, sempre dal file click.php4, Header("Location: $url");

    Questo è il codice originale di click.php4
    Codice PHP:
    <?php
      
    /**
       * tClick v 0.93 beta
       * Copyright 2001 Stephen G. Walizer aka Technomancer all rights reserved.
       * This software is licensed under the GNU GPL. See the file GPL or
       * [url]http://www.gnu.org[/url] for details.
       **/
      
      
    Header("Location: $url");

      
    // MySQL database information
      
    $host '60.150.149.40';
      
    $username 'username';
      
    $password 'password';
      
    $database 'db1';
      
    $clicktable 'clicktable';
      
    $categorytable 'categorytable';
      
    $autoaddurl 'N';


      
    $con mysql_connect($host$username$password);
      
    $result mysql_db_query($database"SELECT clicks FROM $clicktable WHERE url='$url'");
      if(
    $row mysql_fetch_array($result)) {
        
    $value $row['clicks'];
        
    $value++;
        
    $query "UPDATE $clicktable SET clicks=$value WHERE url='$url'";
        
    mysql_db_query($database$query);
      } else {
        if(
    $autoadd == 'Y') {
          
    $query "INSERT INTO $clicktable (id, url, clicks, deleted) VALUES (NULL, '$url', 1, 'N')";
          
    mysql_db_query($database$query);
        }   
      }
      
    mysql_close($con);
    ?>
    Questo è il codice modificato con l'inserimento della funzione forceDownload:
    Codice PHP:
    <?php
      
    /**
       * tClick v 0.93 beta
       * Copyright 2001 Stephen G. Walizer aka Technomancer all rights reserved.
       * This software is licensed under the GNU GPL. See the file GPL or
       * [url]http://www.gnu.org[/url] for details.
       **/
      
      
    function forceDownload( &$file ) { 
    /**
    * Function forceDownload:
    * download any type of file if it exists and is readable
    * -------------------------------------
    * @author Andrea Giammarchi
    * @date 18/01/2005
    * @compatibility PHP >= 4.3.0
    */ 
    if( file_exists$file ) == true && is_readable$file ) == true ) { 
    $filename = &basename$file ); 
    if( 
    strpos$_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false ) { 
    $parsename = &explode'.'$filename ); 
    $last count$parsename ) - 1
    $filename = &implode'%2E'array_slice$parsename0$last ) ); 
    $filename .= '.'.$parsename[$last]; 

    $content = &file_get_contents$file ); 
    header'Content-Type: application/octet-stream' ); 
    header'Content-Disposition: attachment; filename='.$filename ); 
    header'Content-Length:'.strlen$content ) ); 
    header'Content-Transfer-Encoding: binary' ); 
    echo 
    $content
    exit(
    0); 

    }

    forceDownload($file); 

      
    // MySQL database information
      
    $host '60.150.149.40';
      
    $username 'username';
      
    $password 'password';
      
    $database 'db1';
      
    $clicktable 'clicktable';
      
    $categorytable 'categorytable';
      
    $autoaddurl 'N';


      
    $con mysql_connect($host$username$password);
      
    $result mysql_db_query($database"SELECT clicks FROM $clicktable WHERE url='$url'");
      if(
    $row mysql_fetch_array($result)) {
        
    $value $row['clicks'];
        
    $value++;
        
    $query "UPDATE $clicktable SET clicks=$value WHERE url='$url'";
        
    mysql_db_query($database$query);
      } else {
        if(
    $autoadd == 'Y') {
          
    $query "INSERT INTO $clicktable (id, url, clicks, deleted) VALUES (NULL, '$url', 1, 'N')";
          
    mysql_db_query($database$query);
        }   
      }
      
    mysql_close($con);
    ?>
    3 - poichè "Location" non trasmette solo un header al browser, ma anche un redirect, se lo elimino come può funzionare il counter?

    Grazie
    ciao
    luca

  4. #4
    3) se dopo
    header()
    non c'è un
    exit;
    lo script viene comunque eseguito

    credo

  5. #5
    passando per il counter non riesco a far "funzionare la funzione"
    quindi l'ho sostituita inserendo in click.php4 una cosa diquesto tipo:
    Codice PHP:
    $path $HTTP_GET_VARS['filepath'];
    $file basename($path);
    $size filesize($path);

    header ("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=$file");
    header("Content-Length: $size");

    readfile($path); 
    e nel file musica.html ho inserito dei link tipo questo:
    la finestra "save as" si apre, il nome è giusto ma... il file pesa 0Kb. perchè?
    Provare per credere: http://www.ellissinelcerchio.net/musica.html

    ciao
    luca

  6. #6
    grazie ad una dritta di solofumo, così funziona:
    Codice PHP:
    $path $HTTP_GET_VARS['filepath'];
    $file basename($path);

    header ("Content-Type: application/octet-stream");
    header ("Content-Disposition: attachment; filename=$file");

    readfile($path); 
    ho eliminato:
    Codice PHP:
    $size filesize($path);

    header("Content-Length: $size"); 
    l'unico problema è che ora la finestra "save as" non mi mostra il peso del file e conseguentemente la barra di avanzamento del download.
    ciao

  7. #7
    fatto, c'è anche la barra di download:
    Codice PHP:
    $path $HTTP_GET_VARS['filepath'];
    $file basename($path);
    $content = &file_get_contents$path );

    header ("Content-Type: application/octet-stream");
    header ("Content-Disposition: attachment; filename=$file");
    header 'Content-Length:'.strlen$content ) ); 
    e poi ho spostato in fondo al codice di click.php4 (subito prima del tag di chiusura del php) questo:
    Codice PHP:
    readfile($path); 
    così passa per il contatore altrimenti funzionava ma usciva prima di aver incrementato il numero dei click.

    ciao

  8. #8
    forceDownload ha un exit a fine funzione, le operazioni vanno fatte prima di usare quella funzione, non dopo o non andranno mai ...
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.