Как можно загрузить изображение из формы в корневую директорию сайта в папку img?

Здравствуйте! Я написал следующий код: 

```php
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['card-img']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['card-img']['tmp_name'], $uploadfile)) {
    echo "Файл не содержит ошибок и успешно загрузился на сервер.\n";
} else {
    echo "Возможная атака на сервер через загрузку файла!\n";
}

echo 'Дополнительная отладочная информация:';
print_r($_FILES);
```

Однако он выдает следующую ошибку:

```
Fatal error : Uncaught TypeError: basename(): Argument #1 ($path) must be of type string, array given in /Users/mihail_razmyslovitch/Desktop/Proekty web design/project-fest/admin/news-admin.php:14 Stack trace: #0 /Users/mihail_razmyslovitch/Desktop/Proekty web design/project-fest/admin/news-admin.php(14): basename(Array) #1 {main} passed in /Users/mihail_razmyslovitch/Desktop/Proekty web design/project-fest/admin/news-admin.php on line 14
```

Могли бы вы подсказать, в чем может быть проблема?
  • 24 сентября 2024 г. 12:43
Ответы на вопрос 3
Ошибка, которую вы получаете, указывает на то, что переменная `$_FILES['card-img']['name']` является массивом, а не строкой. Это может произойти, если вы разрешили загрузку нескольких файлов в вашем HTML-форме, используя атрибут `multiple`. В этом случае `$_FILES['card-img']` будет массивом, содержащим информацию о каждом загруженном файле.

Если вы хотите загрузить только один файл, убедитесь, что в вашей HTML-форме не установлен атрибут `multiple`. Например:

```html
<form enctype="multipart/form-data" method="POST">
    <input type="file" name="card-img">
    <input type="submit" value="Загрузить">
</form>
```

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

```php
$uploaddir = '/var/www/uploads/';

foreach ($_FILES['card-img']['name'] as $key => $name) {
    $uploadfile = $uploaddir . basename($name);

    echo '<pre>';
    if (move_uploaded_file($_FILES['card-img']['tmp_name'][$key], $uploadfile)) {
        echo "Файл $name успешно загружен на сервер.\n";
    } else {
        echo "Возможная ошибка при загрузке файла $name.\n";
    }
}

echo 'Дополнительная отладочная информация:';
print_r($_FILES);
```

Таким образом, каждый файл будет обрабатываться по отдельности и загружаться на сервер. Обратите внимание, что вам также стоит убедиться в безопасности загружаемых файлов, проверяя их типы и размеры перед загрузкой.
Здесь все неправильно. <br/> Первая строка - путь к папке, которой нет на вашем ПК (да и на рельном сервере такого не будет в 99,99%) <br/> Вторая строка - не секьюрно.  В идеале пользователь никак не должен влиять на выбор имени файла, под которым он сохраниться. <br/> if move_upload_file - никаких проверок на атаку сайта не делает. <br/> <br/> Ну и ошибка у вас в коде html формы, которая шлет данные. <br/> Посмотрите что вы там с именем поля (card-img) input сделали.  Или квадратные скобки или возможно несколько раз с одним именем написали.
<blockquote>Подскажите, что не так</blockquote> <br/> 1) Вы не читаете и не осмысливаете текст ошибки. Не в смысле глазами, а в смысле "что там произошло то?". Для вас текст ошибки проблема, а не путь решения. <br/> 2) Не проверяете то, что интерпретатор считает неправильным, что как бы прямое следствие п.1. <br/> 3) Считаете что знаете что на самом деле лежит в переменных, не заглядывая в реальные данные.
Похожие вопросы