Reputation: 195
I am trying to use this code to download a .zip file
<?php
$file = "something.zip";
$size = filesize($file);
header('Content-type: application/octet-stream');
header("Content-length: $size");
header('Content-Disposition: attachment; filename="downloaded.zip"');
readfile($file);
?>
but it does not seem to work, even when I try to set the filesize to a number like header("Content-length: 567247784");
. I only get a file that either has no size declared, or a small file size like 28 bytes.
I looked at this question, and I think I have the same problem as the poster, but his solution is "there was a server problem". I think I also have a server configuration issue, but his answer does not help me at all.
Upvotes: 10
Views: 14837
Reputation: 548
Sometimes mod_deflate isn't the culprit. There's an Apache env variable that governs trusting CGI-like scripts with Content-Length setting.
SetEnv ap_trust_cgilike_cl 1
Without it, Apache will ignore Content-Length set by PHP scripts.
Upvotes: 4
Reputation: 3204
Following on from TeeraMusic great analysis https://stackoverflow.com/a/30569921/820841 which identified mod_deflate as the culprit 👍
apache_setenv('no-gzip', '1');
Proper way to stop mod_deflate for this request.
The option which controls which files are DEFLATE will most likely be in your .htaccess
or httpd.conf
:
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
...
Content-Type
for your response and it is not just matching as text/html
.Content-Type
from this list if you do not want it to be passed through mod_deflate.Upvotes: 0
Reputation: 2454
I think the easiest and the best way is:
$head = array_change_key_case(get_headers($file, TRUE));
$filesize = $head['content-length'];
Upvotes: 1
Reputation: 482
it has to do with mod_deflate getting in the way. I spent a day messing with .htaccess and trying a million different things, in the end this fixed it but I can't really explain why:
header('Content-Length: '.$filesize);
header("Content-Range: 0-".($filesize-1)."/".$filesize);
I want to add that my PHP was configured with less than 256MB of memory.
Upvotes: 28
Reputation: 503
I had the same problem, and in my case it was solved when I found in some php file included one escape character before <?php
tag. Then, the returned by page is bigger than informed in $size = filesize($file);
And this cause the error.
Upvotes: -1
Reputation: 15159
Try to remove the trailing ?>
in cases like this. The newlines or whitespace after the ?>
can alter the result.
Usually, the webserver will set the Content-Length header automatically.
For debugging, you can use the very awesome http://fiddler2.com/ to inspect the headers or even compose an arbitrary request to test your assumptions. Fiddler will warn if the content body is different from the Content-Length
header.
Upvotes: 0