0

I have a zip file on my server and I have a small bit of code to download it, however when I open it, its empty but the file size is still identical when I pull it directly off the server.

I've ensured that all php tags have no spaces before or after their opening/closing and have tried quite a few different solutions found across the site but none of them have worked. I've also double checked to make sure that the zip isn't corrupt on the server side as well.

    public function adownload()
{

    $file = "template.zip";
    if (file_exists($file)) 
    {
         header('Content-Description: File Transfer');
         header('Content-Type: application/zip');
         header('Content-Disposition: attachment; filename="'.basename($file).'"');
         header('Expires: 0');
         header('Cache-Control: must-revalidate');
         header('Pragma: public');
         header('Content-Length: ' . filesize($file));
         readfile($file);

    }
}

any suggestions appreciated.

Argent Drake
  • 71
  • 11

2 Answers2

0

I found a nice little guide about all the things that can throw errors, in my case it was that my classes had ending ?> tags. After removed, everything works great. Guide to removing problems

Community
  • 1
  • 1
Argent Drake
  • 71
  • 11
0

Your browser is closing the connection before the download is complete. This results in an empty archive zip directory.

The cause is the server choking under heavy load.

The solutions is pacing the server by breaking up the stream into smaller chunks. Instead of readfile() use this code:

set_time_limit(0); //prevent server timeout
$chunk_size = 1024 * 8; //set the chunk size to 8kB
$handle = fopen($file, 'rb');
$buffer = '';
while (!feof($handle)) {
     $buffer = fread($handle, $chunk_size);
     echo $buffer;
     flush();
     ob_flush();
     sleep(1); // take a break
}
fclose($handle);
Scriptonomy
  • 3,975
  • 1
  • 15
  • 23