Servir el archivo alojado en otro servidor como descarga
Tengo una pregunta simple pero crítica (crítica para mi solicitud)
Tendré una URL de archivo como:
http://a.com/b.jpg
http://a.com/b.zip
http://a.com/b.mp3
<or any valid file>
Cuando el usuario haga clic en el enlace de descarga de cualquier archivo específico (por ejemplo, b.jpg) en mi sitio, es decir, b.com, el usuario verá la URL como
http://b.com/?f=1
No quiero que el usuario vea la URL original y, en segundo lugar, quiero forzar la descarga del archivo, independientemente del tipo de archivo.
Sé que puedo lograr esto usando readfile (consulte el Ejemplo 1 en http://php.net/manual/en/function.readfile.php ), pero no sé el tamaño y el tipo mime, ¿cómo puedo estar seguro de que el archivo ¿Se descargará correctamente?
Por favor ayuden chicos
Supongo que puedes usar cURL para activar una solicitud HEAD para la URL de destino. Esto permitirá que el servidor web que aloja el destino tenga el tipo MIME y la longitud del contenido del archivo.
$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);
Luego, puede volver a escribir estos encabezados en la solicitud HTTP realizada en su secuencia de comandos:
header('Content-Type: '.$mimeType);
header('Content-Disposition: attachment; filename="'.$filename. '";' );
header('Content-Length: '.$size);
Y luego continúa con el contenido del archivo.
readfile($url);