Как можно загрузить изображение из формы в корневую директорию сайта в папку 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);
```

Таким образом, каждый файл будет обрабатываться по отдельности и загружаться на сервер. Обратите внимание, что вам также стоит убедиться в безопасности загружаемых файлов, проверяя их типы и размеры перед загрузкой.
Здесь все неправильно. 
Первая строка - путь к папке, которой нет на вашем ПК (да и на рельном сервере такого не будет в 99,99%)
Вторая строка - не секьюрно. В идеале пользователь никак не должен влиять на выбор имени файла, под которым он сохраниться.
if move_upload_file - никаких проверок на атаку сайта не делает.

Ну и ошибка у вас в коде html формы, которая шлет данные.
Посмотрите что вы там с именем поля (card-img) input сделали. Или квадратные скобки или возможно несколько раз с одним именем написали.
Подскажите, что не так

1) Вы не читаете и не осмысливаете текст ошибки. Не в смысле глазами, а в смысле "что там произошло то?". Для вас текст ошибки проблема, а не путь решения.
2) Не проверяете то, что интерпретатор считает неправильным, что как бы прямое следствие п.1.
3) Считаете что знаете что на самом деле лежит в переменных, не заглядывая в реальные данные.
Похожие вопросы