Я только что выпустил новую версию моего плагина для загрузки файлов для Пирожное .
Это сделает загрузку и загрузку файлов действительно простой. Хочешь посмотреть? Продолжайте читать.
Предпосылки
Если у вас есть существующее приложение, вы можете перейти прямо к Создать приложение для загрузки файлов .
- Пирожное 4
- Https-сервер
- PHP 7.x или 8
- расширения php mbstring, intl, SimpleXML, PDO
Для получения дополнительной информации проверьте Установка CakePHP
операционная
- Докер
- Докер-сочинять
Верно, только эти двое. Я покажу вам, как это сделать в этом уроке.
Подготовьте Окружающую среду
Я буду использовать для этого урока свой стартовый набор CakePHP , но вы можете использовать существующую установку. Этот стартовый набор содержит все, что вам понадобится для создания вашего приложения в кратчайшие сроки. Он содержит:
- Пирожное 4
- PHP 7.4.16, со всеми необходимыми расширениями
- Postgres
- Мини (хранилище s3)
- Повторный вызов
- Администратор
Хорошо, запустите его и выполните команды в командной оболочке следующим образом
mkdir fileupload-tutorial cd fileupload-tutorial docker run --rm --volume $(pwd):/app ghcr.io/maymeow/php-ci-cd/php-ci-cd:7.4.16-cs-1 sh -c "composer create-project --prefer-dist maymeow/cakephp-starter-kit:dev-main /app" sudo chown -R $USER:$GID .
Вы можете запустить ls -la , чтобы проверить, все ли папки принадлежат вам. Хорошо, теперь мы создаем наше приложение
Создать приложение для загрузки файлов
Установка плагина
Прежде всего, нам нужно установить плагин загрузки файлов и загрузить его, выполнив следующую команду
docker-compose -f docker-compose.dev.yml run --rm cake-app composer require maymeow/file-upload
и загрузи его
docker-compose -f docker-compose.dev.yml run --rm cake-app php bin/cake.php plugin load FileUpload
Создание MVC для файлов
Следующий шаг – создать MVC для нашего контроллера файлов. Для наших нужд достаточно иметь таблицу с именем файла и временем создания и изменения. Создайте миграцию следующим образом
docker-compose -f docker-compose.dev.yml run --rm cake-app php bin/cake.php bake migration CreateFiles name:string created modified
внесение изменений в базу данных
docker-compose -f docker-compose.dev.yml run --rm cake-app php bin/cake.php migrations migrate
и создайте MVC для наших файлов
docker-compose -f docker-compose.dev.yml run --rm cake-app php bin/cake.php bake all Files
Теперь пришло время запустить наше приложение со следующей командой
docker-compose -f docker-compose.dev.yml up -d
Перейдите к http://127.0.0.1:8765/ в вашем любимом браузере вы увидите Добро пожаловать в CakePHP 4.2.10 Strawberry сообщение. Это нормально, и приложения или приложения теперь запущены. Чтобы открыть контроллер или файлы, перейдите в http://127.0.0.1:8765/files .
Создание представления загрузки и контроллера
Стандартный контроллер создания CakePHP для просмотра, списка, редактирования и добавления. Но это не то, что нам нужно. Мы хотим загрузить файл на сервер, а этот отсутствует. Так что создавайте его. Прежде всего создайте новые модели из
docker-compose -f docker-compose.dev.yml run --rm cake-app php bin/cake.php bake form Upload
Перейдите к src/Form/UploadForm.php и отредактируйте схему _build как следует
protected function _buildSchema(Schema $schema): Schema
{
return $schema->addField('file', 'string');
}
Создание представления и контроллера для формы загрузки
Перейдите в src/Контроллер/Файловый контроллер и добавьте следующую функцию
public function upload()
{
$uploadForm = new UploadForm();
$this->set(compact('uploadForm'));
}
и создать upload.php просмотр в шаблонах/файлах со следующим содержимым
/** * @var \App\View\AppView $this * @var \App\Form\UploadForm $uploadForm */ ?>= $this->Form->create($uploadForm, ['type' => 'file']) ?> = $this->Form->button(__('Submit')) ?> = $this->Form->end() ?>
Теперь вы можете перейти к http://127.0.0.1:8765/files/upload и если вы не видите никакой ошибки, кроме Загрузить файл форма, вы можете идти.
Настройка плагина загрузки и загрузка файлов
Следующий шаг – загрузить наши компоненты в контроллер
public function initialize(): void
{
parent::initialize(); // TODO: Change the autogenerated stub
$this->loadComponent('FileUpload.Upload', [
'fieldName' => 'file',
]);
$this->loadComponent('FileUpload.Download');
}
Загрузка файлов
Теперь вы загрузили компоненты плагина Uploadfile, так что осталось еще кое-что сделать. Обновите функцию загрузки следующим образом
public function upload()
{
$uploadForm = new UploadForm();
if ($this->request->is('post')) {
$uploadedFile = $this->Upload->getFile($this->request);
$file = $this->Files->newEmptyEntity();
$file->name = $uploadedFile->getFileName();
$this->Files->save($file);
return $this->redirect(['action' => 'index']);
}
$this->set(compact('uploadForm'));
}
Если все пойдет правильно, вы увидите имя файла для загрузки в списке всех файлов.
Загрузка файлов
Создайте новую функцию для загрузки файлов в Контроллере файлов
public function download($fileName)
{
$downloadedFile = $this->Download->getFile($fileName);
$response = $this->response;
$response = $response->withStringBody($downloadedFile->getFileContent());
$response = $response->withType($downloadedFile->getFileType());
if ($this->request->getParam('?.download') == true) {
$response = $response->withDownload($fileName);
}
return $response;
}
И редактировать шаблоны/Файлы/индекс.ctp
# edit line= h($file->name) ?> # to this= $this->Html->link($file->name, ['action' => 'download', $file->name, '?' => ['download' => false]]) ?>
Обновить страницу. При этом отобразится изображение, которое вы загрузили ранее, нажав на имя файла. Если вы хотите вместо этого показать форму загрузки, измените загрузка к истинному .
Поддержка S3
Если вы хотите использовать S3 вместо локального хранилища, вам нужно внести в него некоторые небольшие изменения… Прежде всего откройте свой app_local.php и добавьте в конце файла следующую конфигурацию
'S3' => [
'version' => 'latest',
'region' => 'us-east-1',
'endpoint' => 'http://cake_minio:9000',
'use_path_style_endpoint' => true,
'credentials' => [
'key' => 'minioadmin',
'secret' => 'minioadmin',
],
]
Теперь перейдите к http://127.0.0.1:9001 и войдите в систему с учетными данными по умолчанию, как пароль, так и имя пользователя minioadmin . В правом меню перейдите в раздел ведра и создайте ведро для ваших нужд. Для этих целей я создаю корзину с именем загрузка файла.учебник .
Вы можете проверить это в Обозревателе объектов на боковой панели.
Теперь давайте настроим наше приложение. Обновите Контроллер файлов следующим образом:
public function initialize(): void
{
parent::initialize(); // TODO: Change the autogenerated stub
$this->loadComponent('FileUpload.Upload', [
'fieldName' => 'file',
'storagePath' => 'fileupload.tutorial', // bucket name
'storage_type' => 's3'
]);
$this->loadComponent('FileUpload.Download', [
'storagePath' => 'fileupload.tutorial', // bucket name
'storage_type' => 's3'
]);
}
Хорошо, теперь у вас есть приложение, которое может загружать/скачивать файлы в локальное хранилище или хранилище S3. Легко, нет?
Вывод
Я ленивый человек, поэтому я хотел упростить запуск своих приложений (не говорите, что CakePHP сам по себе нелегко запустить). А с помощью стартового набора вы сможете приступить к работе за несколько секунд и сосредоточиться на своем приложении.
С помощью плагина загрузки файлов вы можете загружать/скачивать файлы как в локальное хранилище, так и в хранилище s3 буквально с помощью одной строки кода (не считая конфигурации). Я надеюсь, что это облегчит вам управление загрузкой файлов в ваше приложение. Если вы обнаружите ошибки, пожалуйста, сообщите о них на Отслеживание проблем с загрузками файлов , также, если у вас есть какие-то идеи, которые я открыл Обсуждения для проекта, где вы можете поделиться своими идеями.
В любом случае, если вам нравится этот проект, вы можете внести свой вклад в него в репозитории GitHub , который также участвует в Хактоберфесте.
То же самое относится и к CakePHP starter kit , который тоже есть на Github.
Бонус
Все исходные коды из этого руководства доступны здесь Учебник по загрузке файлов на Github .
Спасибо за чтение и хорошего дня!
Первоначально опубликовано на themaymeow.com блог
Оригинал: “https://dev.to/maymeow/uploading-files-with-cake-php-and-fileupload-plugin-303d”