I've been having my forced downloads sometimes finish prematurely using readfile(). I'm downloading a Windows .exe file. I've read several posts that have suggested the substitution of a fread/feof loop to write out the download in smaller chunks. I tried using a function (readfile_chunked) I found in the user comments on php.net. But for some odd reason, every time the downloaded file is one byte larger than the original file, and it's not being recognized as a valid Windows file. I'm using PHP 4.4.4 on a shared Linux server running Apache. IE and FireFox both exhibit the problem on the Windows end. I'm using WinXP SP2. I've listed relevant snippets below. $file_name is the fully qualified path to the (.exe) file. Any ideas? #============================= # Download the File #============================= header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private", false); header("Content-Description: File Transfer"); header("Content-Type: application/octet-stream"); header("Accept-Ranges: bytes"); header("Content-Disposition: attachment; filename=" . $file_name . ";"); header("Content-Transfer-Encoding: binary"); header("Content-Length: " . @filesize($file_path)); header ("Connection: close"); @ignore_user_abort(); @set_time_limit(0); // @readfile($file_path); readfile_chunked($file_path, FALSE); exit(); ...... function readfile_chunked($filename, $retbytes = true) { $chunksize = 8 * 1024; // how many bytes per chunk $buffer = ''; $cnt = 0; $handle = fopen($filename, 'rb'); if ($handle === false) { return false; } while (!feof($handle)) { $buffer = fread($handle, $chunksize); echo $buffer; ob_flush(); flush(); if ($retbytes) { $cnt += strlen($buffer); } } $status = fclose($handle); if ($retbytes && $status) { return $cnt; // return num. bytes delivered like readfile() does. } return $status; } -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php