Don wrote:
> 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.
does the end of your download script look like this?:
?>
by which I mean does it actually resemble one of the following strings:
$end = "?>
";
$end = "?> ";
is there a space or newline AFTER the last closing php tag?
avoid this PITA type of bug and never ever add a closing php tag
*if* it's the last thing in the file .. the php engine will see that it's
reached
EOF and consider that as a closing tag as far as trying to parse any code
goes.
>
> 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