• Consiglio Direttivo

    [File e Cartelle] readfile();

    ** PHP 4, 5**
    Sintassi: int readfile ( string ***$file **,bool $include_path=***false [, resource $context ]] )

    Readfile è una funzione di PHP che serve ad inviare un file come output (download da browser) sfruttando gli opportuni header.
    La funzione restituisce il numero di byte relativi al file puntato ($file). In caso di errore nella lettura del file restituirà invece FALSE.

    Vari esempi di utilizzo sono presenti sul sito di php.net, quì.
    Ne riporto uno, il più semplice, che utilizza dei normalissimi header di output transfer, presente nella pagina sopra lincata:
    [php]<?php
    $file = 'monkey.gif';

    if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
    }
    ?>[/php]E' importante avere gli adeguati permessi di lettura sul file puntato dalla funzione.

    Opzionalmente è possibile ricercare il file all'interno della include_path stabilita impostandola su TRUE.

    Con la risorsa $context è possibile richiamare una funzione di flusso (Stream Functions).


  • User Newbie

    Ciao, ho seguito la vostra guida per scaricare i file con php.
    E' stata molto utile, pero ho un problema: quando scarico un file .doc per esempio e vado ad aprirlo è vuoto, e dice che è di sola lettura.


  • ModSenior

    Ciao nicolanapo, fai attenzione alla punteggiatura e alle maiuscole...
    Prova ad impostare i permessi a 777 al file richiamato dalla funzione readfile.


  • User Newbie

    Ho provato a impostare i permessi ma niente.
    Il codice l'ho copiato dalla guida quindi per la punteggiatura credo stia bene.
    ho effettuato una modifica, ho messo nel file downloadit.php due righe all'inizio e cioe:
    $nome_file=$_GET['nome_file'];
    $dimensioni_file=$_GET['dimensioni_file'];

    perche quando mi elencava i file e cliccavo per scaricarli mi scaricava il file downloadit.php stesso. spero di essere stato chiaro.


  • Consiglio Direttivo

    Ciao nicolanapo e benvenuto nel Forum GT. 🙂

    Io ho appena testato con un file .doc e funziona regolarmente.

    Direi che dovresti verificare il percorso del file che viene passato agli header e soprattutto che il file in remoto non sia per caso vuoto ed in sola lettura. 😉


  • User Newbie

    Ciao, le uniche modifiche che ho effettuato sono state cambiare il nome della directory da docs a quella che uso, e mettere nel file downloadit.php queste due righe:
    $nome_file=$_GET['nome_file'];
    $dimensioni_file=$_GET['dimensioni_file'];

    Il file remoto non è vuoto e non è in sola lettura... :gtsad:


  • User Newbie

    Io ho un problema simile, ossia io mi prendo il mio bel file da scaricare, nella pagina iniziale, lo passo a download.php, che me lo scarica con il suo nome, il problema è che mi scarica solamente pochi byte 200/300 del file e pertanto risulta corrotto, dove sbaglio


  • User Attivo

    @Thedarkita said:

    Ciao nicolanapo, fai attenzione alla punteggiatura e alle maiuscole...
    Prova ad impostare i permessi a 777 al file richiamato dalla funzione readfile.

    Se io lo metto dentro una cartella devo dare i permessi chmod 777 anche alla cartella?


  • User Attivo

    @antoniog2 said:

    Se io lo metto dentro una cartella devo dare i permessi chmod 777 anche alla cartella?

    Sono riuscito a fare il download con i permessi 777 anche alla cartella.
    Ho impostato il file con nome scarica.php e ho inserito il file nella cartella.
    scarica.php è nella root.
    Ora proverò a dare alla cartella solo i permessi di lettura per vedere se ciò è funzionale alle mie necessità e sarei già ad almeno il 33% di ciò che mi interessa realizzare cioè un download di file a tempo e limitandolo a 1 solo download.


  • User Attivo

    Ho notato che nello script c'è il seguente codice:

    
    ...
    header('Expires: 0');
    ...
    
    

    Si imposta in secondi?


  • User Attivo

    Sono riuscito a modificare il file per passargli il nome del file da scaricare ma vorrei modificarlo ulteriormente per consentire solo 1 download e che tale download sia fatto entro 7 giorni dall'inoltro del link via email.
    In alternativa mi accontenterei di consentire 1 solo download.