Я хочу начать загрузку с помощью PHP, но я не хочу, чтобы пользователь знал URL загружаемого файла.
Я прочитал много ответов в StackOverflow, но все, что я нашел, показывает URL-адрес загруженного файла.
Вот что я хочу сделать, например:
Это файл PHP, пользователь увидит этот URL: http://website.com/download.php
Это URL загруженного файла, я не хочу, чтобы пользователь видел этот URL: http://website.com/file.zip
Есть какой-либо способ сделать это?
Это зависит от того, что вы хотите скрыть. URL когда-либо будет показан пользователю, но если вы не хотите, чтобы пользователь знал, какие параметры (или значения) отправляют, вы можете закодировать их и отправить их с помощью запроса POST через AJAX.
Попробуй это:
$file = './file.zip';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"'); //<<< Note the " " surrounding the file name
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
Перед рендерингом страницы сохраните URL-адрес загрузки (например, в сеансе) и сгенерируйте некоторый уникальный хеш, который позже вы можете использовать, чтобы определить, какой файл следует загрузить:
$SESSION['file_download']['hash'] = md5(time) . '_' . $userId; // lets say it equals to 23afg67_3425
$SESSION['file_download']['file_location'] = 'real/path/to/file';
При рендеринге показывать пользователю следующую ссылку для скачивания:
http://yourdomain.com/download_file.php?hash=23afg67_3425
Если пользователь щелкает его, вы отправляете файл пользователю, но допускаете это только один раз или во время текущего сеанса. Под этим я подразумеваю, что вы должны создать новый исходный файл с именем download_file.php со следующим содержимым:
if ($_GET['hash'] == $SESSION['file_download']['hash']) {
// send file to user by outputing the file data to browser
$file = $SESSION['file_download']['file_location'];
header('Content-Description: File Transfer')
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
// optionaly reset $SESSION['file_hash'] so that user can not download again during current session, otherwise the download with generated link will be valid until user session expires (user closes the browser)
} else {
// display error message or something
}