Иногда хочется при нажатии ссылки получить готовый файл с содержимым, для этого можно использовать PHP, передавая заголовки, таким образом браузер будет выводить окно сохранения, предлагаю сохранять файл на компьютере.
Основные методы описаны в Источник
но применяя далее эту технологию, мне было необходимо загружать не просто файл с сервера, а файл с другого сервера. Для этого можно чуть поменять код, добавив в него копирование удаленного файла к себе во временную директорию. Имя файла можно брать с помощью функции pathinfo($url) , которая в свою очередь возвращает массив данных о файле, нам нужен ‘basename’ , либо воспользоваться функцией basename($url);. Надо сказать что ни pathinfo, ни basename не проверяют на существование файла, они лишь работают со строкой.
После отработки скрипта и сохранения файла на диске, файл можно удалить с помощью например unlink($file);
function file_force_download($url) {
$file = __DIR__.'/temp/'.basename($url);
if (file_exists($file)) {
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
// если этого не сделать файл будет читаться в память полностью!
if (ob_get_level()) {
ob_end_clean();
}
// заставляем браузер показать окно сохранения файла
header('Content-Description: File Transfer');
header('Content-Type: image/jpeg');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
// var_dump(filesize($file));exit();
// читаем файл и отправляем его пользователю
if ($fd = fopen($file, 'rb')) {
while (!feof($fd)) {
print fread($fd, 1024);
}
fclose($fd);
}
unlink($file);
exit;
}
}
Это далеко не единственный способ сохранения файлов, но как один из вариантов для решения задачи вполне подходит.