droidus
droidus

Reputation: 641

php file force download

When I use this code to download this image (only used for testing purposes), I open the downloaded image, and all it gives me is an error. i tried it in chrome. opening it with windows photo viewer, it says that it can't display the picture because it is empty??? here is the code:

<?PHP
 // Define the path to file
 $file = 'http://www.media.lonelyplanet.com/lpi/12553/12553-11/469x264.jpg';

 if(!file)
 {
     // File doesn't exist, output error
     die('file not found');
 }
 else
 {
     header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);
        exit;
 }
 ?>

Upvotes: 4

Views: 5286

Answers (4)

iambriansreed
iambriansreed

Reputation: 22241

Replace:

ob_clean();
flush();
readfile($file);

With:

echo file_get_contents($file);

Upvotes: 1

Gokul N K
Gokul N K

Reputation: 2458

If your intention is just the download the file from a third party on click of a link, you could use the new property download in the anchor tag.

The code will look something like

<a download href="path/to/the/download/file"> Clicking on this link will force download the file</a>

It works on firefox and chrome latest version. Should I mention that I didn't check it in IE? :P

Upvotes: 1

Umbrella
Umbrella

Reputation: 4788

I've had a chance to work it out. Your problem is two-fold.

First, remove the www. from the url.

Second, remove the call to filesize($file) which is throwing an error because PHP doesn't know the size of the file before it downloads the file. (really, just remove the whole line)

Removing these two things, I was successful.

Upvotes: 4

Umbrella
Umbrella

Reputation: 4788

Replace ob_clean() with ob_end_clean()

You're still buffering, so none of the image contents get to the browser.

Upvotes: 2

Related Questions