[PHP] Send binary files with gzip encoding disabled

2007-05-04 Thread strawks
Hello,

I'm trying to send a ZIP file generated on the fly in a temporary directory.
The ZIP file is created successfully and I'm using the following code to send 
it to the client :

$filesize=filesize($path);
$mimetype='application/zip';

// Make sure there's not anything else left
ob_clean_all();

// Start sending headers
header(Pragma: public); // required
header(Expires: 0);
header(Cache-Control: must-revalidate, post-check=0, pre-check=0);
header(Cache-Control: private,false); // required for certain browsers
header(Content-Transfer-Encoding: binary);
header(Content-Description: File Transfer);
header(Content-Type: .$mimetype);
header(Content-Disposition: attachment; filename=\.$name.\; );
header(Content-Length: .$filesize);

[EMAIL PROTECTED]($path,rb); 
while([EMAIL PROTECTED]($fp))
{
set_time_limit(0);
print @fread($fp, 8192);
}
@fclose($fp);

The ob_clean_all() function :
function ob_clean_all () {
$ob_active = ob_get_length () !== false;
while($ob_active) {
ob_end_clean();
$ob_active = ob_get_length () !== false;
}

return true;
}

The problem is that Apache process the output throught gzip and so drop the 
Content-Length header replacing it with a chunked transfer. This should work 
fine but Internet Explorer simply save the raw gzip compressed data instead of 
the ZIP archive. However this works fine with Firefox.

gzip encoding is unecessary since I'm transfering a ZIP archive, so I think 
just disabling it should solve the problem, but I haven't found how to do this.

Any help would be appreciated.

-- 
strawks.


 
-
 Découvrez une nouvelle façon d'obtenir des réponses à toutes vos questions ! 
Profitez des connaissances, des opinions et des expériences des internautes sur 
Yahoo! Questions/Réponses.

Re: [PHP] Send binary files with gzip encoding disabled

2007-05-04 Thread Richard Lynch
On Fri, May 4, 2007 9:56 am, strawks wrote:
 $filesize=filesize($path);
 $mimetype='application/zip';

 // Make sure there's not anything else left
 ob_clean_all();

 // Start sending headers
 header(Pragma: public); // required
 header(Expires: 0);
 header(Cache-Control: must-revalidate, post-check=0,
 pre-check=0);
 header(Cache-Control: private,false); // required for certain
 browsers
 header(Content-Transfer-Encoding: binary);
 header(Content-Description: File Transfer);
 header(Content-Type: .$mimetype);
 header(Content-Disposition: attachment; filename=\.$name.\;
 );
 header(Content-Length: .$filesize);

All these headers scare me -- I've found that if you add all these,
sooner or later, you run into some browser that didn't do it right
anyway.

You may want to look at an alternative K.I.S.S. approach (rant):
http://richardlynch.blogspot.com
YMMV

 The problem is that Apache process the output throught gzip and so
 drop the Content-Length header replacing it with a chunked transfer.
 This should work fine but Internet Explorer simply save the raw gzip
 compressed data instead of the ZIP archive. However this works fine
 with Firefox.

 gzip encoding is unecessary since I'm transfering a ZIP archive, so I
 think just disabling it should solve the problem, but I haven't found
 how to do this.

There was a discussion yesterday on php-internals regarding Apache/PHP
forcing the HTTP response to 1.1 even if the browser asked for 1.0.

Part of that discussion was a sub-discussion about how it ought to be
possible for a PHP developer to FORCE the response to be 1.0

If your response is 1.0, there would be no chunking, as I understand it.

So there may be an answer for you buried in that thread, or you may
want to weigh in on a real-world need for this feature.

-- 
Some people have a gift link here.
Know what I want?
I want you to buy a CD from some indie artist.
http://cdbaby.com/browse/from/lynch
Yeah, I get a buck. So?

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php