Firefox PHP komut dosyalarını kullanarak indirilen bir dosyada bazı html içeriği var

2 Cevap php

PHP ile bir dosya indirmek için aşağıdakileri kullanabilirsiniz:

  ob_start();

   $browser = id_browser();
   header('Content-Type: '.(($browser=='IE' || $browser=='OPERA')?
      'application/octetstream':'application/octet-stream'));
   header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
   header('Content-Transfer-Encoding: binary');
   header('Content-Length: '.filesize(realpath($fullpath)));
   //header("Content-Encoding: none");

   if($browser == 'IE')
   {
    header('Content-Disposition: attachment; filename="'.$file.'"');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
   } else 
   {
    header('Content-Disposition: attachment; filename="'.$file.'"');
    header('Cache-Control: no-cache, must-revalidate');
    header('Pragma: no-cache');
   }


   //@set_time_limit( 0 );
   ReadFileChunked(utf8_decode($fullpath));   

   ob_end_flush();

ReadFileChunked kaynak kodu:

function ReadFileChunked($filename,$retbytes=true) 
{
 $chunksize = 1*(1024*1024); 
 $remainFileSize = filesize($filename);

 if($remainFileSize < $chunksize)
  $chunksize = $remainFileSize;

 $buffer = '';
 $cnt =0;
 // $handle = fopen($filename, 'rb');
 //echo $filename."<br>";
 $handle = fopen($filename, 'rb');
 if ($handle === false) {
  //echo 1;
  return false;
 }
 //echo 2;
 while (!feof($handle)) 
 {  
  //echo "current remain file size $remainFileSize<br>";
  //echo "current chunksize $chunksize<br>";
  $buffer = fread($handle, $chunksize);
  echo $buffer;
  sleep(1);
  ob_flush();
  flush();
  if ($retbytes) {
   $cnt += strlen($buffer);
  }

  $remainFileSize -= $chunksize;
  if($remainFileSize == 0)
   break;

  if($remainFileSize <  $chunksize)
  {
   $chunksize = $remainFileSize;   
  }
 }

 $status = fclose($handle);
 if ($retbytes && $status) {
  return $cnt; // return num. bytes delivered like readfile() does.
 }
 return $status;
}

The question is : The file downloaded will contiain some html tags which are the content of the html code generated by the php.

4096 bayt daha küçük dosya boyutu ile txt dosyası indirirken hata oldu olacak.

Bana bu sorunu slove için lütfen yardımcı olun, çok teşekkür ederim!

Chu

2 Cevap

Bunun yerine özel fonksiyonu dışında fpassthru kullanarak denedim.

Orada $ ChunkSize malzeme kullanmaya gerek yoktur. $ ChunkSize normalde daha fazla okumak için söylerdim bile fread() otomatik olarak, bu dosyanın sonuna ulaştığında okuma durur. Yanı sıra, muhtemelen ob_flush() koymak gerekir ve flush() sleep(1) ÖNCE çağırır. Bu şekilde sadece çıktı tamponunda yerleştirdiğiniz veri gereksiz bir saniye beklemek zorunda kalmadan Web sunucusu kapalı gönderilir alabilirsiniz.

Aslında, aşağıdaki ile tüm işlevini yerini alabilir:

function ReadFileChunk($filename, $retbytes = true) {
    $fh = fopen($filename, 'rb');
    if (!$fh) {
        return(false);
    }
    while($buf = fread($fh, 4096)) {
         echo $buf;
         ob_flush();
         flush();
         sleep(1);
    }
    $status = fclose($fh);

   return( $retbytes ? filesize($filename) : $status);
}

Ama neden readfile() zaten var olduğunda kendi çalışırken rahatsız? Bu dosyayı açmadan ve geçmez normal büyüklükte parçalar halinde göndermek tüm iş idare edecek memory_limit.