Рубрики
Uncategorized

Загрузка файлов С помощью CakePHP и плагина для загрузки файлов

Я только что выпустил новую версию своего плагина для загрузки файлов для CakePHP. Это сделает загрузку и… С тегами php, cakephp, веб-разработчик, учебник.

Я только что выпустил новую версию моего плагина для загрузки файлов для Пирожное .

Это сделает загрузку и загрузку файлов действительно простой. Хочешь посмотреть? Продолжайте читать.

Предпосылки

Если у вас есть существующее приложение, вы можете перейти прямо к Создать приложение для загрузки файлов .

  • Пирожное 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
 */
?>
Form->create($uploadForm, ['type' => 'file']) ?>
Form->control('file', ['type' => 'file']); ?>
Form->button(__('Submit')) ?> 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 
name) ?>
# to 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”