Я хочу знать, как реализовать логику для моей кнопки загрузки в PHP. У меня есть файл на веб-сервере и есть страница с кнопкой загрузки. Я хочу начать загрузку файла, когда пользователь нажал кнопку загрузки. Как внедрить? СпасибоКак реализовать логику для моей кнопки загрузки
ответ
Вот как вы начинаете загрузку, не позволяя пользователю увидеть реальный путь к файлу. Сделайте ссылку ссылкой на файл download.php? File = filename и убедитесь, что файл существует в папке загрузки. Затем используйте этот код для проверки наличия файла и его загрузки. При желании вы можете поместить в него регистрацию или другую проверку.
<?php
//download.php
$dir = '/path/to/file/';
if (isset($_GET['file']) && !is_dir($_GET['file']) && file_exists($dir . $_GET['file'] . '.zip'))
{
$file = $dir . $_GET['file'] . '.zip';
header('Content-type: application/force-download');
header('Content-Transfer-Encoding: Binary');
header('Content-length: ' . filesize($file));
header('Content-disposition: attachment; filename=' . basename($file));
readfile($file);
}
else
{
echo 'No file selected';
}
?>
Кроме того, вы можете также блокировать доступ к папке с файлами в ней с помощью файла .htaccess. Если вы хотите, поместите следующий код в файл .htaccess в каталог файлов.
order allow, deny
deny from all
Это довольно опасно. Что делать, если я решил запросить файл '../../../ home/user/something'? 'file_exists' будет соответствовать запросу, предполагая, что файл действительно существует, и' readfile' с радостью прочитает файл '/ path/to/file /../../../ home/user/something'. Вы * можете * защитить такой метод, но зачем рисковать? – Welbog
@Welbog: спасибо! Я полностью забыл об этом. Я изменил сценарий так, чтобы он только загружал .zip-файл. Конечно, он может быть расширен, так что он позволяет больше расширений, например .pdf или что-то еще. – Evert
Это немного лучше, но он по-прежнему позволяет вам захватывать zip-файлы из других каталогов. Было бы лучше не использовать пользовательские идентификаторы в реальных путях. – Welbog
В обеих предусмотренных sollutions (ReadFile или заголовок X-Sendfile) файл может быть сохранен вне каталога общего сервера (обычно называемый HTDOCS или WWW).
//page.php
<form method="get" action="download.php">
With button <input type="submit" value="Download file" />
</form>
or
With link <a href="download.php">Download file</a>
<?php // download.php
$file = '/path/to/file.zip';
if (file_exists($file)) {
// send headers that indicate file download
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
// send file (must read comments): http://php.net/manual/en/function.readfile.php
readfile($file);
exit;
}
Лучше гуманного, если ваш сервер поддерживает заголовок X-Sendfile (mod_xsendfile) является:
<?php
header('Content-Disposition: attachment;filename=hello.txt');
header('X-Sendfile: /path/to/file.zip');
http://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/
Просто используйте простую ссылку вместо кнопки? – halfdan
Проблема заключается в том, что я не хочу показывать пользователям путь, где находится файл dowloadable. Если я использую ссылку, пользователь может увидеть файл url, что неприемлемо –
Вы вытаскиваете ресурс с веб-сервера. Этот ресурс всегда будет иметь адрес, и вы не можете скрыть это. – Welbog