Загрузка файлов с сервера php

У меня есть URL-адрес, где я сохраняю некоторые проекты из своей работы, это в основном файлы MDB, но некоторые JPG и PDF тоже есть.

Что мне нужно сделать, так это перечислить каждый файл из этого каталога (уже сделано) и дать пользователю возможность его загрузить.

Как это достигается с помощью PHP?

Ответ 1

Чтобы прочитать содержимое каталога, вы можете использовать readdir() и использовать script в моем примере download.php для загрузки файлов

if ($handle = opendir('/path/to/your/dir/')) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != "..") {
            echo "<a href='download.php?file=".$entry."'>".$entry."</a>\n";
        }
    }
    closedir($handle);
}

В download.php вы можете заставить браузер отправлять данные загрузки и использовать basename(), чтобы убедиться, что клиент не передает другое имя файла, например ../config.php

$file = basename($_GET['file']);
$file = '/path/to/your/dir/'.$file;

if(!$file){ // file does not exist
    die('file not found');
} else {
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=$file");
    header("Content-Type: application/zip");
    header("Content-Transfer-Encoding: binary");

    // read the file from disk
    readfile($file);
}

Ответ 2

Если папка доступна из браузера (не за пределами корня документа вашего веб-сервера), вам просто нужно вывести ссылки на места этих файлов. Если они находятся вне корня документа, вам понадобятся ссылки, кнопки, что угодно, что указывает на PHP script, который обрабатывает получение файлов из своего местоположения и потоковой передачи в ответ.

Ответ 3

Вот более простое решение, чтобы перечислить все файлы в каталоге и загрузить его.

В файле index.php

<?php
$dir = "./";

$allFiles = scandir($dir);
$files = array_diff($allFiles, array('.', '..')); // To remove . and .. 

foreach($files as $file){
     echo "<a href='download.php?file=".$file."'>".$file."</a><br>";
}

Функция scandir() перечисляет все файлы и каталоги внутри указанного пути. Он работает как с PHP 5, так и с PHP 7.

Теперь в файле download.php

<?php
$filename = basename($_GET['file']);
// Specify file path.
$path = ''; // '/uplods/'
$download_file =  $path.$filename;

if(!empty($filename)){
    // Check file is exists on given path.
    if(file_exists($download_file))
    {
      header('Content-Disposition: attachment; filename=' . $filename);  
      readfile($download_file); 
      exit;
    }
    else
    {
      echo 'File does not exists on given path';
    }
 }