Как загрузить изображение и файл в CodeIgniter (с примером)

⚡ Умное резюме

CodeIgniter File Upload использует встроенную библиотеку Upload для перемещения изображений и документов из HTML-формы в каталог на сервере. В этом примере создается форма загрузки, контроллер, проверяющий тип и размер, и страница результатов, подтверждающая загрузку.

  • 📁 Основной курс: Библиотека Upload выполняет работу на стороне сервера, проверяя отправленный файл и записывая его в выбранную директорию для загрузки.
  • 🖼️ Две части: Для загрузки файла необходима HTML-форма на стороне клиента с полем ввода типа «файл», а также контроллер на стороне сервера, обрабатывающий отправленные данные.
  • 🔒 Типы, включенные в белый список: Параметр allowed_types разрешает только файлы с указанными расширениями, такими как gif, jpg и png, блокируя при этом опасные файлы, например, PHP-скрипты.
  • 📏 Ограничения по размеру: Ключи max_size, max_width и max_height отклоняют файлы, превышающие установленные ограничения, и возвращают понятное сообщение об ошибке.
  • ???? Кодировка формы: В форме необходимо установить параметр enctype в значение multipart/form-data, иначе выбранный файл никогда не достигнет сервера.
  • 📄 Метаданные результата: В случае успеха функция upload->data() возвращает сведения о файле, использованные для создания ссылки на только что сохраненное изображение.
  • 🤖 AI-помощь: Инструменты искусственного интеллекта могут генерировать форму загрузки, правила проверки контроллера и обработку ошибок, а затем проверять их на наличие уязвимостей в системе безопасности.

CodeЗагрузка файла Igniter

CodeЗагрузка файла Igniter

Управление файлами имеет важное значение для большинства веб-приложений. Если вы разработчик...ping Если вы используете систему управления контентом, вам потребуется возможность загружать изображения, документы Word, PDF-отчеты и многое другое. Если вы работаете над сайтом с платным доступом, вам может потребоваться предусмотреть возможность загрузки изображений профиля для пользователей. CodeКласс Igniter File Uploading позволяет нам легко выполнить все вышеперечисленное.

В этом уроке мы рассмотрим, как использовать библиотеку загрузки файлов для загрузки файлов.

Загрузка изображений в Codeвоспламенитель

Загрузка файла в Codeвоспламенитель Он состоит из двух основных частей: фронтенда и бэкенда. Фронтенд обрабатывается HTML-формой, использующей поле ввода типа «файл». На бэкенде библиотека для загрузки файлов обрабатывает отправленные из формы данные и записывает их в каталог для загрузки.

Начнём с формы ввода.

Создайте новую директорию с именем files в директории application/views.

Добавьте следующие файлы в папку application/views/files.

  • upload_form.php – это представление содержит HTML-форму, которая имеет тип входного файла и отправляет выбранный файл на сервер для обработки.
  • upload_result.php – в этом файле отображаются результаты загрузки изображения, включая ссылку, по которой можно перейти для просмотра результатов.

Добавьте следующий код в upload_form.php

<!DOCTYPE html>
<html>
<head>
<title>CodeIgniter Image Upload</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>
<h3>Select an image from your computer and upload it to the cloud</h3>
<?php
if (isset($error)){
echo $error;
}
?>
<form method="post" action="<?=base_url(0)?>" enctype="multipart/form-data">
<input type="file" id="profile_image" name="profile_image" size="33" />
<input type="submit" value="Upload Image" />
</form>
</div>
</body>
</html>

ВОТ,

  • Функция `if (isset($error)){…}` проверяет, установлена ​​ли переменная ошибки. Если результат истинный, то пользователю отображается ошибка, возвращаемая библиотекой загрузки.
  • Функция выбора типа файла позволяет пользователю перейти на свой компьютер и выбрать файл для загрузки.

Добавьте следующий код в файл upload_result.php

<!DOCTYPE html>
<html>
<head>
<title>Image Upload Results</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>
<h3>Congratulations, the image has successfully been uploaded</h3>
<p>Click here to view the image you just uploaded
<?=anchor('images/'.$image_metadata['file_name'], 'View My Image!')?>
</p>
 
<p>
<?php echo anchor('upload-image', 'Go back to Image Upload'); ?>
</p>
</div>
</body>
</html>

ВОТ,

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

Теперь давайте создадим контроллер, который будет реагировать на загрузку изображения.

Добавьте новый файл ImageUploadController.php в application/controllers.

Добавьте следующий код в ImageUploadController.php

<?php
 
defined('BASEPATH') OR exit('No direct script access allowed');
 
class ImageUploadController extends CI_Controller {
 
public function __construct() {
parent::__construct();
$this->load->helper('url', 'form');
}
 
public function index() {
$this->load->view('files/upload_form');
}
 
public function store() {
$config['upload_path'] = './images/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 2000;
$config['max_width'] = 1500;
$config['max_height'] = 1500;
 
$this->load->library('upload', $config);
 
if (!$this->upload->do_upload('profile_image')) {
$error = array('error' => $this->upload->display_errors());
 
$this->load->view('files/upload_form', $error);
} else {
$data = array('image_metadata' => $this->upload->data());
 
$this->load->view('files/upload_result', $data);
}
}
 
}

ВОТ,

  • класс ImageUploadController расширяет CI_Controller {…} определяет наш класс контроллера и расширяет базовый контроллер CI_Controller
  • публичная функция __construct() {…} инициализирует метод родительского конструктора и загружает URL-адрес и помощники формы
  • публичная функция index() {…} определяет метод индекса, который используется для отображения формы загрузки изображения
  • public function store() {…} определяет метод, который будет загружать изображение и сохранять его на сервере веб-приложений.
    • $config['upload_path'] = './images/'; устанавливает каталог, в который должны быть загружены изображения
    • Параметр `$config['allowed_types'] = 'gif|jpg|png';` определяет допустимые расширения файлов. Это важно по соображениям безопасности. Разрешенные типы гарантируют, что загружаются только изображения, а другие типы файлов, такие как PHP, не могут быть загружены, поскольку они потенциально могут скомпрометировать сервер.
    • Параметр `$config['max_size'] = 2000;` устанавливает максимальный размер файла в килобайтах. В нашем примере максимальный размер загружаемого файла составляет 2,000 КБ, что близко к 2 МБ. Если пользователь попытается загрузить файл размером более 2,000 КБ, загрузка изображения завершится неудачей, и библиотека вернет сообщение об ошибке.
    • Параметр `$config['max_width'] = 1500` задает максимальную ширину изображения, которая в нашем случае составляет 1,500 пикселей. Любая ширина, превышающая это значение, приведет к ошибке.
    • $config['max_height'] = 1500; определяет максимально допустимую высоту.
    • $this->load->library('upload', $config); загружает библиотеку загрузки и инициализирует ее с помощью массива $config, который мы определили выше.
    • if (!$this->upload->do_upload('profile_image')) {…} пытается загрузить отправленное изображение, которое в нашем случае называется profile_image
    • $error = array('error' => $this->upload->display_errors()); устанавливает сообщение об ошибке, если загрузка не удалась
    • $this->load->view('files/upload_form', $error); загружает форму загрузки файла и отображает сообщение об ошибке, возвращаемое из библиотеки загрузки
    • $data = array('image_metadata' => $this->upload->data()); устанавливает метаданные изображения, если загрузка прошла успешно
    • $this->load->view('files/upload_result', $data); загружает представление успешно загруженного файла и передает метаданные загруженного файла.

На этом работа с контроллером завершена. Теперь давайте создадим директорию, куда будут загружаться изображения. Создайте новую директорию «images» в корневом каталоге вашего приложения.

Наконец, мы добавим в файл routes.php два маршрута, которые будут отображать форму и результаты.

Откройте файл application/config/routes.php и добавьте следующие маршруты.

$route['upload-image'] = 'imageuploadcontroller';
$route['store-image'] = 'imageuploadcontroller/store';

ВОТ,

  • $route['upload-image'] = 'imageuploadcontroller'; определяет URL Загрузка изображения, вызывающая метод index контроллера ImageUploadController.
  • $route['store-image'] = 'imageuploadcontroller/store'; определяет URL store-image — это функция, которая принимает выбранный пользователем файл и загружает его на сервер.

Как исправить распространенные ошибки CodeОшибки загрузки файлов в Igniter

В большинстве случаев при сбоях загрузки библиотека Upload выдает понятное сообщение. Ниже приведен список распространенных ошибок и способов их устранения.

  • Тип файла, который вы пытаетесь загрузить, недопустим: Добавьте отсутствующее расширение в конфигурацию allowed_types, например, 'gif|jpg|png|pdf'.
  • Размер загружаемого файла превышает допустимый: Увеличьте значение параметра max_size и убедитесь, что значения upload_max_filesize и post_max_size в файле php.ini достаточно велики.
  • Путь для загрузки, по всей видимости, недействителен: Создайте каталог upload_path и убедитесь, что веб-сервер имеет права на запись в него.
  • Вы не выбрали файл для загрузки: Убедитесь, что имя поля ввода совпадает с аргументом функции do_upload() и что форма использует тип данных enctype multipart/form-data.

Тестирование приложения

Давайте запустим встроенный PHP-сервер.

Откройте терминал или командную строку и перейдите в корневую папку вашего приложения. В моем случае корневая папка находится на диске C:\Sites\ci-app

cd C:\Sites\ci-app

Запустите сервер, используя следующую команду.

php -S localhost:3000

Загрузите следующее URL в вашем веб-браузере: http://localhost:3000/upload-image

Вы сможете увидеть следующие результаты.

Загрузка изображений в Codeвоспламенитель

Нажмите выбрать файл

Вы должны увидеть диалоговое окно, подобное следующему.

Загрузка изображений в Codeвоспламенитель

Выберите нужное изображение, затем нажмите «Открыть».

Загрузка изображений в Codeвоспламенитель

Имя выбранного файла отобразится в форме загрузки, как показано на изображении выше. Нажмите кнопку «Загрузить изображение».

При условии, что всё пройдёт гладко, вы получите следующие результаты.

Загрузка изображений в Codeвоспламенитель

Нажмите на ссылку «Посмотреть мое изображение!»

Вы должны увидеть загруженное вами изображение. Результаты будут примерно такими, как показано ниже.

Загрузка изображений в Codeвоспламенитель

Обратите внимание, что название загруженного изображения отображается в... URLНазвание изображения мы получили из метаданных загруженного изображения.

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

Часто задаваемые вопросы (FAQ)

CodeБиблиотека Igniter 3 Upload обрабатывает один файл за один вызов функции do_upload(), поэтому вы перебираете переменную $_FILES и вызываете её для каждого элемента. CodeIgniter 4 поддерживает одновременную загрузку нескольких файлов непосредственно через метод getFileMultiple().

№ CodeВ Igniter 4 библиотека Upload заменена API Request для работы с файлами. Вы вызываете `$this->request->getFile('field'), проверяете его, а затем используете `move()` для сохранения файла, вместо загрузки отдельной библиотеки для загрузки.

Установите $config['encrypt_name'] = TRUE, чтобы присвоить каждому файлу случайное имя, или установите $config['file_name'] на выбранное вами значение. Это предотвратит перезапись существующих файлов, имеющих то же исходное имя.

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

Да. Вставьте сообщение об ошибке и ваш контроллер, и ИИ сможет выявить такие проблемы, как отсутствие многокомпонентной формы, недоступный для записи путь загрузки или отсутствие расширения в allowed_types, а затем предложить решение.

Подведем итог этой публикации следующим образом: