Reputation: 15950
I have a simple, yet critical question (critical for my application)
I will have a file url as:
http://a.com/b.jpg
http://a.com/b.zip
http://a.com/b.mp3
<or any valid file>
When user will click on download link for any specific file (say b.jpg) on my site i.e., b.com, user will see url as
http://b.com/?f=1
I don't want user to see original URL and secondly, want to force download of file, irrespective of filetype
I know that I can achieve this using readfile (Check Example1 at http://php.net/manual/en/function.readfile.php), but I don't know filesize and mimetype, how can I get assurance that file will be downloaded properly?
Please help guys
Upvotes: 0
Views: 2693
Reputation: 437336
I suppose you can use cURL to fire off a HEAD request for the target URL. This will let the web server hosting the target the mimetype and content length of the file.
$url = 'http://www.example.com/path/somefile.ext';
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true); // make it a HEAD request
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$head = curl_exec($ch);
$mimeType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
$path = parse_url($url, PHP_URL_PATH);
$filename = substr($path, strrpos($path, '/') + 1);
curl_close($ch);
Then, you can write back these headers to the HTTP request made on your script:
header('Content-Type: '.$mimeType);
header('Content-Disposition: attachment; filename="'.$filename. '";' );
header('Content-Length: '.$size);
And then you follow this up with the file contents.
readfile($url);
Upvotes: 3
Reputation:
Upvotes: 0