Hi, I am having a problem forcing a download from PHP. I am running 5.2 Stable. I have followed numerous tutorials and still can't figure it out. What I'm trying to do is force-download a file I made, because the browser likes opening it up inside, but it won't let me use relevant paths so I have to type in the full web address every time. Here's my working and not working code:

Working:

if ($checkbox) {
		$file = 'http://12.148.233.90/downloads/Tutorial1.wmv.zip';
		// Set headers
		header("Cache-Control: public");
		header("Content-Description: File Transfer");
		header("Content-Disposition: attachment; filename=Tutorial1.wmv.zip");
		header("Content-Type: application/zip");
		header("Content-Transfer-Encoding: binary");
		//header("Content-Length: " . filesize($file));
		ob_clean();
		flush();
		readfile("$file");
		exit;
	}
	else {
		...
        }

Not working, but want to work:

if ($checkbox) {
		$file = 'downloads/Tutorial1.wmv.zip';
		// Set headers
		header("Cache-Control: public");
		header("Content-Description: File Transfer");
		header("Content-Disposition: attachment; filename=Tutorial1.wmv.zip");
		header("Content-Type: application/zip");
		header("Content-Transfer-Encoding: binary");
		header("Content-Length: " . filesize($file));
		ob_clean();
		flush();
		readfile("$file");
		exit;
	}
	else {
		...
	}

With the not working code section, it says that it can't find the file. The reason I want that section working is because I want the file size to be correct when you download (so it doesn't say "Unknown Time Remaining") and to simplify the code a little bit. Thanks for your help.

If you need me to clarify anything, just ask. I could also map my HDD and upload my IIS settings too.

Recommended Answers

All 5 Replies

if ($checkbox) {
$file = 'downloads/Tutorial1.wmv.zip';
// Set headers
header("Cache-Control: public ;");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=Tutorial1.wmv.zip");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($file) ."; ");

maybe, going to think

me too had the same problem but I gave full path.

Try giving path from a variable preceded by $_SERVER['SERVER_NAME']; thus by making full path?

Hope this will work for you.

(thought your plan was to use same code in local and remote servers).

$_SERVER returned a strange response; the server created a new zip file when I used that in the path, sent it over to me, and then deleted it (

$file = $_SERVER['SERVER_NAME'] . '/downloads/Tutorial1.wmv.zip';

). I know the file exists, and I echo'd the $_SERVER['SERVER_NAME'] and that came out correct. That's not a big problem because I can just type the full address like I did before and it works (the same thing that my first code snippet does), what I want is the file size to work most of all, so people aren't left not knowing how big the file is (and these are big files).

I'm getting a little confused on how $file = $_SERVER['SERVER_NAME'] . '/downloads/Tutorial1.wmv.zip'; is different from '12.148.233.90/downloads/Tutorial1.wmv.zip' when they return the same thing. Thanks for your help.

And the reason I'm using this code for zip files is one of two things, I will be force downloading other files than zip (like wmv and txt, most browsers read them) and my firefox somehow has the power to open up zip files within itself and it won't let me download them.

I think it must be something wrong with the config file, it works fine under my PHP 4 Linux server. The php.ini file is available at http://12.148.233.90/php.ini if you want to take a look. I'll be going through it myself, all 1338 lines, sigh. Thanks for the help.

I got it to work, for now, I specified the file size manually along with reordering my info and adding stuff. I'll post the code if you want it.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.