Как получить файл из формы с input type="file" в PHP или в целом получить файл любым способом?

Ссылка скопирована
19 апреля 2026 1 ответ

Сам я мало шарю, а о том, что фотки принято загружать на сервер в виде файлов, а не хранить в БД - узнал вот только тогда, когда было уже слишком поздно...

Проблема состоит в том, что есть у меня форма регистрации пользователя, у пользователя есть и фотография профиля в том числе. Загрузку фотографии я хотел сделать через описанный в вопросе путь, но в таком случае в базу данных попадает только название файла, а не сам файл!

Сессии реализованы стандартными методами PHP - через session_start()

Вот ссылка на архив с кодом - https://disk.yandex.ru/d/4xTvCCh_ytflgg
Мне неохота городить тут тонну текста, ввиду того, что я не понимаю, где может крыться решение, а "компилировать в уме", как говорится, - дело то ещё.

Дополнительно:

но в таком случае в базу данных попадает только название файла, а не сам файл!

В чем проблема?
В php есть методы сохранения и загрузки файлов на диск сервера. Берете нужный путь к файлу и вперед - получать бинарник файла.

Мне неохота городить тут тонну текста, ввиду того, что я не понимаю, где может крыться решение,

Решение кроется в выстрадании вами этих пунктов:
1) Запрос и получение бинарника файла от пользователя с использованием объекта FileReader на JS.
2) Передача через ajax post запроса на сервер, содержащий бинарник файла.
3) Работа с $_FILES на стороне сервера, и выдергивание файла из временной директории.
4) Переименовывание файла на уникальное имя и сохранение на постоянное место на диске сервера, а также сохранение исходного имени файла, его пути расположения, размер и других атрибутов в СУБД.
5) Чтение сведений о файле из СУБД по его id/хешу и передача его содержимого пользователю.

Сессии реализованы стандартными методами PHP - через session_start()

Данные в сессии должны быть максимально легковесными, в идеале, должен храниться только идентификатор сессии, пользователя, его статус авторизации, другие токены прав доступа к сторонним API. Все остальное должно храниться в СУБД, что-то на диске сервера. Если нужен кеш, то использовать memcached или redis.

Массив файлов, передаваемых формой выводится в $_FILES, ключом является название поля, например input type="file" name="avatar", тогда чтобы получить путь к файлу из временной директории:

<? $tmp_dir = '/var/www/uploads/'; // путь к временной директории из настроек php.ini $tmp_file = $tmp_dir . basename($_FILES['avatar']['name']); // путь к временному файлу ?>

<? $tmp_dir = '/var/www/uploads/'; // путь к временной директории из настроек php.ini $tmp_file = $tmp_dir . basename($_FILES['avatar']['name']); // путь к временному файлу ?>

Дальше нужно переместить файл туда, где хотите хранить картинки на сервере, а путь записать в базу.

Инфа на php.net.

  • Сделал вот так
    <?php  ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); error_reporting(E_ALL);  include("dbConnect.php");  $tmp_dir = '/var/www/uploads/'; // путь к временной директории из настроек php.ini $tmp_file = $tmp_dir . basename($_FILES['image']['name']); // путь к временному файлу   move_uploaded_file($tmp_file, "../img/"); // перемещаем файл в временную директорию  mysqli_close($connect);

    <?php ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); error_reporting(E_ALL); include("dbConnect.php"); $tmp_dir = '/var/www/uploads/'; // путь к временной директории из настроек php.ini $tmp_file = $tmp_dir . basename($_FILES['image']['name']); // путь к временному файлу move_uploaded_file($tmp_file, "../img/"); // перемещаем файл в временную директорию mysqli_close($connect);

    Форма регистрации вот

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <title>Регистрация</title>      </head> <body>     <div class="account-container">         <h2>Личный кабинет</h2>         <form method="post" action="scripts/register.php">             <label for="username">Имя пользователя:</label>             <input type="text" id="login" name="login" required>              <label for="email">Email:</label>             <input type="email" id="email" name="email" required>              <label for="password">Пароль:</label>             <input type="password" id="password" name="password" required>              <label for="image">Фото профиля:</label>             <input type="file" id="image" name="image">              <button type="submit">Зарегестрироваться</button>         </form>     </div>  </body> </html>

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Регистрация</title> </head> <body> <div class="account-container"> <h2>Личный кабинет</h2> <form method="post" action="scripts/register.php"> <label for="username">Имя пользователя:</label> <input type="text" id="login" name="login" required> <label for="email">Email:</label> <input type="email" id="email" name="email" required> <label for="password">Пароль:</label> <input type="password" id="password" name="password" required> <label for="image">Фото профиля:</label> <input type="file" id="image" name="image"> <button type="submit">Зарегестрироваться</button> </form> </div> </body> </html>

    Результат

    Notice: Undefined index: image in D:OSPanelFromTiny10domainsVanechkascriptsregister.php on line 10

  • michadimin, говорит что нет такого индекса(image) в массиве, посмотрите, что вам вообще приходит в $_FILES
    echo '<pre>' ; print_r($_FILES); echo '</pre>' ;

    echo '<pre>' ; print_r($_FILES); echo '</pre>' ;

  • michadimin, форма должна уметь передавать файлы, надо добавить в тег вот это enctype="multipart/form-data", прочитайте что написано по ссылке в моем сообщении, там всё написано, и по ссылкам в сообщении выше.
  • Евгений, так, спасибо большое, я почти разгадал сея загадку!

    Итак, в данный момент у меня проблема: когда я записываю двоичный файл в БД, то его вес не совпадает с изначальным, собственном как и содержимое

    Как я и говорил - мне нужно помещать картинки непосредственно в саму БД, а не класть в папку с проектом. Знаю, что такой подход не практикуется, но мне нужно именно так в данный момент.

    Я попробовал считывать данные из файла с картинкой в виде обычного текста и пихнуть его в БД - новые записи не добавлялись. И тогда я нашёл функцию mysqli_real_escape_string().

    Вот код

    <?php ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); error_reporting(E_ALL);  include("dbConnect.php");   echo '<pre>' ; print_r($_FILES); echo '</pre>' ; echo php_ini_loaded_file()."n";  move_uploaded_file($_FILES["image"]["tmp_name"], "../img/".$_FILES["image"]["name"]);  $filename = '../img/'.$_FILES["image"]["name"];   $text = ''; $fh = fopen($filename, 'r'); while (!feof($fh)) { 	$line = fgets($fh); 	$text .= $line . PHP_EOL; } fclose($fh);   $sql = "INSERT INTO `Users`(`Name`, `Surname`, `Password`, `Email`, `Image`) VALUES ('".$_POST["name"]."','".$_POST["surname"]."','".$_POST["password"]."','".$_POST["email"]."','".mysqli_real_escape_string($connect, $text)."')"; $connect->query($sql);  mysqli_close($connect); header('Location: ../profile.php');

    <?php ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); error_reporting(E_ALL); include("dbConnect.php"); echo '<pre>' ; print_r($_FILES); echo '</pre>' ; echo php_ini_loaded_file()."n"; move_uploaded_file($_FILES["image"]["tmp_name"], "../img/".$_FILES["image"]["name"]); $filename = '../img/'.$_FILES["image"]["name"]; $text = ''; $fh = fopen($filename, 'r'); while (!feof($fh)) { $line = fgets($fh); $text .= $line . PHP_EOL; } fclose($fh); $sql = "INSERT INTO `Users`(`Name`, `Surname`, `Password`, `Email`, `Image`) VALUES ('".$_POST["name"]."','".$_POST["surname"]."','".$_POST["password"]."','".$_POST["email"]."','".mysqli_real_escape_string($connect, $text)."')"; $connect->query($sql); mysqli_close($connect); header('Location: ../profile.php');

    Он корректно создаёт запись в БД, однако, если скачать из неё данные(в моём случае это картинка) и если переименовать её в формат картинки - оказывается, что это уже просто набор данных, ни одно приложение не может корректно её прочитать.

  • michadimin, не надо хранить картинку в БД, надо хранить путь к картинке, в виде обычной строки.

    Ещё раз, когда сервер принимает данные формы, то кладёт картинку во временную папку, которая постоянно очищается. Вам нужно скриптом скопировать файл в постоянное место хранения и где будет публичный доступ к ней, и ссылку на этот файл сохранить в базе. Грубо говоря так:

    $sql = "INSERT INTO `Users`(`Name`, `Surname`, `Password`, `Email`, `Imagepath`) VALUES ('".$_POST["name"]."','".$_POST["surname"]."','".$_POST["password"]."','".$_POST["email"]."','".$filename."')"; $connect->query($sql);

    $sql = "INSERT INTO `Users`(`Name`, `Surname`, `Password`, `Email`, `Imagepath`) VALUES ('".$_POST["name"]."','".$_POST["surname"]."','".$_POST["password"]."','".$_POST["email"]."','".$filename."')"; $connect->query($sql);

  • Евгений, ладно, спасибо огромное, без вас я бы реально не разобрался бы.

    Пусть картинку в БД я положить и не смогу, что означает, что мне придётся переписывать подгрузку картинок на сайте, но тот факт, что теперь отправка картинок работает - уже радует!

Ответы:

https://www.php.net/manual/ru/function.move-upload...
Копируете загруженный файл в нужное место на своем сервере. В базу сохраняете его название и местоположение.
Подробнее https://www.php.net/manual/ru/features.file-upload...
И еще дофига инфы https://yandex.ru/search/?text=php+как+загрузить+файл

  • Да вот в том и проблема, что в таком случае придётся полностью переделать то, как работает проект. Я уже видел те варианты, что вы перечислили.
    Неужели нет способа взять и загрузить файл напрямую в БД средствами PHP...?
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Сергей Миронов Ответ

Для получения файла из формы с input type="file" в PHP, вам необходимо использовать массив $_FILES. Этот массив содержит информацию о загруженных файлах, включая имя файла, тип файла, размер файла и темпоральное имя файла на сервере.

Вот пример кода, который позволит вам получить файл из формы:

if(isset($_FILES['file'])) {
    $file = $_FILES['file'];
 
    // Проверяем наличие ошибок при загрузке файла
    if($file['error'] === UPLOAD_ERR_OK) {
        $fileName = $file['name'];
        $fileType = $file['type'];
        $fileSize = $file['size'];
        $fileTmpName = $file['tmp_name'];
 
        // Перемещаем файл из временной директории в нужное место
        move_uploaded_file($fileTmpName, 'путь/до/папки/' . $fileName);
 
        echo 'Файл успешно загружен.';
    } else {
        echo 'Произошла ошибка при загрузке файла.';
    }
}

if(isset($_FILES['file'])) { $file = $_FILES['file']; // Проверяем наличие ошибок при загрузке файла if($file['error'] === UPLOAD_ERR_OK) { $fileName = $file['name']; $fileType = $file['type']; $fileSize = $file['size']; $fileTmpName = $file['tmp_name']; // Перемещаем файл из временной директории в нужное место move_uploaded_file($fileTmpName, 'путь/до/папки/' . $fileName); echo 'Файл успешно загружен.'; } else { echo 'Произошла ошибка при загрузке файла.'; } }

В данном примере мы проверяем существование файла в массиве $_FILES по ключу 'file'. Затем мы проверяем наличие ошибок при загрузке файла. Если ошибок нет, мы получаем информацию о файле (имя, тип, размер, временное имя на сервере) и перемещаем его в нужную директорию с помощью функции move_uploaded_file.

Это простой способ получить файл из формы в PHP. Не забудьте установить правильные разрешения на папку, куда вы сохраняете файл, чтобы избежать проблем с доступом к файлам.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно