By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,876 Members | 1,191 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,876 IT Pros & Developers. It's quick & easy.

Php Download script problem!

P: n/a
C16
Hi All

I have a simple download script for files on my website and I use the code
below to download the files:

$fp = fopen($filename, "rb");
if ( $fp )
{
$filesize = $file['size'];

header("Cache-Control: post-check=0, pre-check=0");
header("Expires: 0");
header("Content-Type: " . $xtype);
header("Content-Length: " . (string)($filesize));
header("Content-Transfer-Encoding: binary");

while ( !feof($fp) )
{
echo(fgets($fp, 4096));
}
fclose($fp);
}

Now this works just fine on Firefox and Opera, and even on IE when its used
in a web page ie <img src="download.php?id=2"/> but if I try and go to a
file directly by typing in the url www.website.com/download.php?id=2 then it
opens a Download dialog asking me to save the file instead of displaying it
in the browser, this only happens with IE though. Am I missing a vital bit
to the header, or is this a problem with IE, if so is there a way around it
at all?

Many thanks.
Oct 13 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
"C16" wrote:
$fp = fopen($filename, "rb");
if ( $fp )
{
$filesize = $file['size'];

header("Cache-Control: post-check=0, pre-check=0");
header("Expires: 0");
header("Content-Type: " . $xtype);
header("Content-Length: " . (string)($filesize));
header("Content-Transfer-Encoding: binary");

while ( !feof($fp) )
{
echo(fgets($fp, 4096));
}
fclose($fp);
}


Assuming $xtype is defined correctly somewhere, I reckon IE is choking on
the Content-Transfer-Encoding header. This is a MIME header -- it doesn't
belong in an HTTP response at all. Go and read RFC 2616 some time.

You don't need to cast $filesize to a string -- PHP will do this for you
anyway. And while you're at it, I suggest you replace the while() loop with
a readfile() statement instead (<http://uk.php.net/readfile>).

Oh, by the way, filesize() is another useful function. That way you can get
rid of the fopen and fclose instructions altogether.

Phil

--
phil [dot] ronan @ virgin [dot] net
http://vzone.virgin.net/phil.ronan/
Oct 13 '05 #2

P: n/a
C16
I was using readfile but found a discussion that showed readfile to be '55%'
slower than reading by chunks (in the readfile function desc on php.net
infact). Also tried the header without Content-Transfer-Encoding and many
other permutations from suggestions found via google but still the same
result on IE.

"Philip Ronan" <in*****@invalid.invalid> wrote in message
news:BF743985.39633%in*****@invalid.invalid...
"C16" wrote:
$fp = fopen($filename, "rb");
if ( $fp )
{
$filesize = $file['size'];

header("Cache-Control: post-check=0, pre-check=0");
header("Expires: 0");
header("Content-Type: " . $xtype);
header("Content-Length: " . (string)($filesize));
header("Content-Transfer-Encoding: binary");

while ( !feof($fp) )
{
echo(fgets($fp, 4096));
}
fclose($fp);
}


Assuming $xtype is defined correctly somewhere, I reckon IE is choking on
the Content-Transfer-Encoding header. This is a MIME header -- it doesn't
belong in an HTTP response at all. Go and read RFC 2616 some time.

You don't need to cast $filesize to a string -- PHP will do this for you
anyway. And while you're at it, I suggest you replace the while() loop
with
a readfile() statement instead (<http://uk.php.net/readfile>).

Oh, by the way, filesize() is another useful function. That way you can
get
rid of the fopen and fclose instructions altogether.

Phil

--
phil [dot] ronan @ virgin [dot] net
http://vzone.virgin.net/phil.ronan/

Oct 13 '05 #3

P: n/a
C16 wrote:
I was using readfile but found a discussion that showed readfile to be '55%'
slower than reading by chunks (in the readfile function desc on php.net
infact). Also tried the header without Content-Transfer-Encoding and many
other permutations from suggestions found via google but still the same
result on IE.

"Philip Ronan" <in*****@invalid.invalid> wrote in message
news:BF743985.39633%in*****@invalid.invalid...

"C16" wrote:
$fp = fopen($filename, "rb");
if ( $fp )
{
$filesize = $file['size'];

header("Cache-Control: post-check=0, pre-check=0");
header("Expires: 0");
header("Content-Type: " . $xtype);
header("Content-Length: " . (string)($filesize));
header("Content-Transfer-Encoding: binary");

while ( !feof($fp) )
{
echo(fgets($fp, 4096));
}
fclose($fp);
}

Assuming $xtype is defined correctly somewhere, I reckon IE is choking on
the Content-Transfer-Encoding header. This is a MIME header -- it doesn't
belong in an HTTP response at all. Go and read RFC 2616 some time.

You don't need to cast $filesize to a string -- PHP will do this for you
anyway. And while you're at it, I suggest you replace the while() loop
with
a readfile() statement instead (<http://uk.php.net/readfile>).

Oh, by the way, filesize() is another useful function. That way you can
get
rid of the fopen and fclose instructions altogether.

Here's what works for me. I haven't tested your case with IE but you
might give it a try.

header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header('Content-Length: ' . filesize($file));

// to download
header('Content-Disposition: attachment; filename=' . basename($file));

// to open in browser
//header('Content-Disposition: inline; filename=' . basename($file));

readfile($file);

--
*****************************
Chuck Anderson Boulder, CO
http://www.CycleTourist.com
Integrity is obvious.
The lack of it is common.
*****************************
Oct 13 '05 #4

P: n/a
C16
Many thanks Chuck that did the trick. For interest the header I have that
works is now:

header("Cache-Control: post-check=0, pre-check=0");
header("Expires: 0");
header('Content-Description: File Transfer');
header("Content-Type: " . $xtype);
header("Content-Length: " . $filesize);
header('Content-Disposition: inline; filename=' . basename($filename));
Here's what works for me. I haven't tested your case with IE but you might
give it a try.

header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header('Content-Length: ' . filesize($file));

// to download
header('Content-Disposition: attachment; filename=' . basename($file));

// to open in browser
//header('Content-Disposition: inline; filename=' . basename($file));

readfile($file);

--
*****************************
Chuck Anderson Boulder, CO
http://www.CycleTourist.com
Integrity is obvious.
The lack of it is common.
*****************************

Oct 13 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.