problema con download link di un file pesante

ciao a tutti,

premetto che sono nuovo nel settore e nel forum, perciò se faccio degli errori nell'esprimermi o nel codice vi prego di avere pazienza ;) ho cercato e ci sono domande simile ma non sul limite di grandezza del file di download.

come da titolo il mio problema è che ho dei file da far scaricare agli utenti del mio sito web attraverso una pagina in php che forza il download.

Il codice di questa pagina precedentemente era questo:

<?php


            //prelevo il titolo della registrazione

            $sql="select * from record where codrec=$codrec";

                        include "$root/include/query2.php";

                        $dati2=mysql_fetch_object($res2);

                        

                        $titolo=$dati2->titolo;

                        $estensione=$dati2->estensione;

                        $traccie=$dati2->traccie;

                        $filename="$titolo.$estensione";

                        $file.=$codrec.".".$estensione;

                        //prelevo il file

                        /*header ("Content-type: octet/stream");

                        header ("Content-disposition: attachment; filename=".$filename.";");

                        header("Content-Length: ".filesize($file));

                        readfile($file);*/

                        

                        

                        header('Content-Type: application/octet-stream');

                        header('Content-Disposition: attachment; filename="'.$filename.'"'); 

                        header('Content-Length: ' . filesize($file));

                        readfile($file);

                        exit;


?>

e questo codice FUNZIONA per i file di giuste dimensioni (sotto i 150 Mb), ma per i file più grandi mi scarica il file ma VUOTO, ovvero con peso di zero kb e il download si chiude subito.

Perciò per risolvere il problema mi sono informato e ho provato questo codice:

<?php


//funzione per il download

function output_file($file, $name, $mime_type='')

{

 /*

 This function takes a path to a file to output ($file), 

 the filename that the browser will see ($name) and 

 the MIME type of the file ($mime_type, optional).


 If you want to do something on download abort/finish,

 register_shutdown_function('function_name');

 */

 if(!is_readable($file)) die('File not found or inaccessible!');


 $size = filesize($file);

 $name = rawurldecode($name);


 /* Figure out the MIME type (if not specified) */

 $known_mime_types=array(

    "pdf" => "application/pdf",

    "txt" => "text/plain",

    "html" => "text/html",

    "htm" => "text/html",

    "exe" => "application/octet-stream",

    "zip" => "application/zip",

    "doc" => "application/msword",

    "xls" => "application/vnd.ms-excel",

    "ppt" => "application/vnd.ms-powerpoint",

    "gif" => "image/gif",

    "png" => "image/png",

    "jpeg"=> "image/jpg",

    "mp4" =>  "video/mp4",

    "avi" =>  "video/avi",

    "flv" =>  "video/x-flv",

    "mp3" =>  "audio/mpeg",

    "wav" =>  "audio/vnd.wave",

    "php" => "text/plain"

 );


 if($mime_type==''){

     $file_extension = strtolower(substr(strrchr($file,"."),1));

     if(array_key_exists($file_extension, $known_mime_types)){

        $mime_type=$known_mime_types[$file_extension];

     } else {

        $mime_type="application/force-download";

     };

 };


 ob_end_clean(); //turn off output buffering to decrease cpu usage


 // required for IE, otherwise Content-Disposition may be ignored

 if(ini_get('zlib.output_compression'))

  ini_set('zlib.output_compression', 'Off');


 header('Content-Type: ' . $mime_type);

 header('Content-Disposition: attachment; filename="'.$name.'"');

 header("Content-Transfer-Encoding: binary");

 header('Accept-Ranges: bytes');


 /* The three lines below basically make the 

    download non-cacheable */

 header("Cache-control: private");

 header('Pragma: private');

 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");


 // multipart-download and download resuming support

 if(isset($_SERVER['HTTP_RANGE']))

 {

    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);

    list($range) = explode(",",$range,2);

    list($range, $range_end) = explode("-", $range);

    $range=intval($range);

    if(!$range_end) {

        $range_end=$size-1;

    } else {

        $range_end=intval($range_end);

    }


    $new_length = $range_end-$range+1;

    header("HTTP/1.1 206 Partial Content");

    header("Content-Length: $new_length");

    header("Content-Range: bytes $range-$range_end/$size");

 } else {

    $new_length=$size;

    header("Content-Length: ".$size);

 }


 /* output the file itself */

 $chunksize = 1*(1024*1024); //you may want to change this

 $bytes_send = 0;

 if ($file = fopen($file, 'r'))

 {

    if(isset($_SERVER['HTTP_RANGE']))

    fseek($file, $range);


    while(!feof($file) && 

        (!connection_aborted()) && 

        ($bytes_send<$new_length)

          )

    {

        $buffer = fread($file, $chunksize);

        print($buffer); //echo($buffer); // is also possible

        flush();

        $bytes_send += strlen($buffer);

    }

 fclose($file);

 } else die('Error - can not open file.');


die();

}   


/*********************************************

            Example of use

**********************************************/



            //prelevo il titolo della registrazione

            $sql="select * from record where codrec=$codrec";

                        include "$root/include/query2.php";

                        $dati2=mysql_fetch_object($res2);

                        

                        $titolo=$dati2->titolo;

                        $estensione=$dati2->estensione;

                        

                            $filename="$titolo.$estensione";

                            $file.=$codrec.".".$estensione;

                        

                        

                        

                        

                        /* 

                        Make sure script execution doesn't time out.

                        Set maximum execution time in seconds (0 means no limit).

                        */

                        set_time_limit(0);

                        //$file_path='that_one_file.txt';

                        output_file($file, $filename, '');


?>

e questo funziona perfettamente per i file piccoli.

per i FILE GRANDI invece inizia il download (al contrario del primo codice che proprio non comincia proprio) ma STRANEMENTE dopo un certo tempo il download si interrompe sempre senza completarsi.

IO HO BISOGNO DI FAR SCARICARE AGLI UTENTI FILES DI CIRCA 300 MB E DI 1 GIGA.

c'è UN LIMITE ALLA DIMENSIONE DI DOWNLOAD con il php?

Sono dimensioni grosse lo so, ma ci sono soluzioni con il php?

Cosa sto sbagliando? devo cambiare qualche impostazione in php.ini?

E' un problema con il tempo di esecuzione dello script? ma non penso perché c'è set_time_limit(0);

Per favore aiutatemi perché ho provato diverse soluzioni e non so più cosa fare. Grazie a tutti

inviato un anno fa
giosue
X 0 X

nessuno ha una risposta?

risposto un anno fa
giosue
X 0 X

Ciao,

probabilmente sono limitati i download direttamente dal server che ospita il tuo sito web... il PHP non ha limiti di Upload o di Download... contatta il gestore del servizio hosting e chiedi fino a quanto puoi caricare e far saricare dagli utenti sul server!!!

A Presto, spero di esserti stato d'aiuto!

risposto un anno fa
John_Pakkuto
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda