PHP mvc как сделать загрузку файлов

кто-нибудь может помочь мне сделать загрузку файла в форме с другими данными, такими как имя электронной почты и т. д. https://github.com/psytonik/School-Project-PHP/tree/master/school_project это проект

Пожалуйста, укажите в вопросе код, который не соответствует вашим ожиданиям.

jrswgtr 18.08.2018 18:57

проблема в том, что я не знаю, как выполнить загрузку файла, если эта внешняя функция или внутри функции создания

Anthony Fink 18.08.2018 19:01

посмотрите на это: w3schools.com/php/php_file_upload.asp затем создайте конечную точку контроллера для отправки формы.

jrswgtr 18.08.2018 19:04

я видел это, но я делаю проект в стиле mvc

Anthony Fink 18.08.2018 19:07

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

jrswgtr 18.08.2018 19:08

хорошо, что мне делать после контроллера?

Anthony Fink 18.08.2018 19:22

Вы должны создать файл представления с формой html. В функции контроллера вы визуализируете представление. Создайте проверку в функции контроллера, чтобы увидеть, отправлена ​​ли форма. (что-то вроде if ( isset($_POST['file']) )) Затем выполните фактическую загрузку файла.

jrswgtr 18.08.2018 19:23

проверьте, пожалуйста, мой github, чтобы понять структуру моего mvc

Anthony Fink 18.08.2018 19:26

Извините, но вы не можете ожидать, что мы прочитаем весь репозиторий проекта. Прочтите это: stackoverflow.com/help/how-to-ask и измените свой вопрос на более конкретный.

jrswgtr 18.08.2018 19:31

Примечание: неопределенный индекс: fileToUpload в / Applications / XAMPP / xamppfiles / htdocs / school_project / app / controllers / Uploads.php в строке 15 Примечание: неопределенный индекс: fileToUpload в / Applications / XAMPP / xamppfiles / htdocs / school_project / app / con‌ trollers / Uploads.php в строке 35 К сожалению, разрешены только файлы JPG, JPEG, PNG и GIF. К сожалению, ваш файл не был загружен.

Anthony Fink 18.08.2018 19:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
10
2 125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На основе структуры вашего приложения я подготовил код, который отправляет форму и загружает несколько файлов. Это должно дать вам представление о рабочем процессе.

В качестве примечания вы должны воспользоваться:

Некоторые ресурсы:

Некоторые серии:

А)

  1. Построение модели предметной области - введение в агностицизм персистентности
  2. Построение модели предметной области - интеграция сопоставителей данных
  3. Введение в услуги
  4. Обработка коллекций агрегированных корней - шаблон репозитория

Б)

  1. Введение в паттерн фронтального контроллера, часть 1
  2. Введение в паттерн фронтального контроллера, часть 2

контроллеры / Test.php

Доступен по маршруту: http://[your-host]/test

<?php

class Test extends Controller {

    private $uploader;

    public function __construct() {
        $this->uploader = new Uploader();
    }

    public function index($extra = []) {
        $data = array_merge([], $extra);

        $this->view('test/index', $data);
    }

    public function upload() {
        $data = [];

        // Get the test name.
        $testName = $_POST['test_name'] ?? '';

        // Validate the test name.
        if (empty($testName)) {
            $errors['test_name'] = 'Please enter student name';
        }

        // Check the files list.
        try {
            if (!$_FILES) {
                throw new UnexpectedValueException(
                'There was a problem with the upload. Please try again.'
                );
            }
        } catch (Exception $exc) {
            echo $exc->getMessage();
            exit();
        }

        // If no errors, then upload the files.
        if (empty($errors)) {
            $uploadResult = $this->uploader->upload($_FILES['files']);

            if ($uploadResult !== TRUE) {
                $errors['files'] = $uploadResult;
            }
        }

        $data['test_name'] = $testName;
        $data['errors'] = $errors ?? [];

        // Flash some success message using the flash() function if no errors occurred...

        $this->index($data);
    }

}

библиотеки / Uploader.php

Вы можете / должны разбить его на несколько методов.

<?php

class Uploader {

    /**
     * If the value is set to a relative path, then the given path is
     * relative to the document root, e.g. to the "public" directory.
     */
    const UPLOAD_DIR = APPROOT . '/uploads/' /* This is an absolute path */;
    const UPLOAD_DIR_ACCESS_MODE = 0777;
    const UPLOAD_MAX_FILE_SIZE = 10485760;
    const UPLOAD_ALLOWED_MIME_TYPES = [
        'image/jpeg',
        'image/png',
        'image/gif',
    ];

    /**
     *
     */
    public function __construct() {

    }

    /**
     * Upload the files list.
     *
     * @param array $files (optional) Files list - as received from $_FILES variable.
     * @return bool|string[] TRUE on success, or a list of errors on failure.
     */
    public function upload(array $files = []) {
        // Normalize the files list.
        $normalizedFiles = $this->normalizeFiles($files);

        // Upload each file.
        foreach ($normalizedFiles as $normalizedFile) {
            $uploadResult = $this->uploadFile($normalizedFile);

            if ($uploadResult !== TRUE) {
                $errors[] = $uploadResult;
            }
        }

        // Return TRUE on success, or the errors list on failure.
        return empty($errors) ? TRUE : $errors;
    }

    /**
     * Normalize the files list.
     *
     * @link https://www.php-fig.org/psr/psr-7/#16-uploaded-files PSR-7: 1.6 Uploaded files.
     *
     * @param array $files (optional) Files list - as received from $_FILES variable.
     * @return array Normalized files list.
     */
    private function normalizeFiles(array $files = []) {
        $normalizedFiles = [];

        foreach ($files as $filesKey => $filesItem) {
            foreach ($filesItem as $itemKey => $itemValue) {
                $normalizedFiles[$itemKey][$filesKey] = $itemValue;
            }
        }

        return $normalizedFiles;
    }

    /**
     * Upload a file.
     *
     * @param array $file A normalized file item - as received from $_FILES variable.
     * @return bool|string TRUE on success, or an error string on failure.
     */
    private function uploadFile(array $file = []) {
        $name = $file['name'];
        $type = $file['type'];
        $tmpName = $file['tmp_name'];
        $error = $file['error'];
        $size = $file['size'];

        /*
         * Validate the file error. The actual upload takes place when the file
         * error is UPLOAD_ERR_OK (the first case in this switch statement).
         *
         * @link https://secure.php.net/manual/en/features.file-upload.errors.php Error Messages Explained.
         */
        switch ($error) {
            case UPLOAD_ERR_OK: /* There is no error, the file can be uploaded. */
                // Validate the file size.
                if ($size > self::UPLOAD_MAX_FILE_SIZE) {
                    return sprintf('The size of the file "%s" exceeds the maximal allowed size (%s Byte).'
                            , $name
                            , self::UPLOAD_MAX_FILE_SIZE
                    );
                }

                // Validate the file type.
                if (!in_array($type, self::UPLOAD_ALLOWED_MIME_TYPES)) {
                    return sprintf('The file "%s" is not of a valid MIME type. Allowed MIME types: %s.'
                            , $name
                            , implode(', ', self::UPLOAD_ALLOWED_MIME_TYPES)
                    );
                }

                // Define the upload path.
                $uploadDirPath = rtrim(self::UPLOAD_DIR, '/');
                $uploadPath = $uploadDirPath . '/' . $name;

                // Create the upload directory.
                $this->createDirectory($uploadDirPath);

                // Move the file to the new location.
                if (!move_uploaded_file($tmpName, $uploadPath)) {
                    return sprintf('The file "%s" could not be moved to the specified location.'
                            , $name
                    );
                }

                return TRUE;

                break;

            case UPLOAD_ERR_INI_SIZE:
            case UPLOAD_ERR_FORM_SIZE:
                return sprintf('The provided file "%s" exceeds the allowed file size.'
                        , $name
                );
                break;

            case UPLOAD_ERR_PARTIAL:
                return sprintf('The provided file "%s" was only partially uploaded.'
                        , $name
                );
                break;

            case UPLOAD_ERR_NO_FILE:
                return 'No file provided. Please select at least one file.';
                break;

            //...
            // AND SO ON FOR THE OTHER FILE ERROR TYPES...
            //...

            default:
                return 'There was a problem with the upload. Please try again.';
                break;
        }

        return TRUE;
    }

    /**
     * Create a directory at the specified path.
     *
     * @param string $path Directory path.
     * @return $this
     */
    private function createDirectory(string $path) {
        try {
            if (file_exists($path) && !is_dir($path)) {
                throw new UnexpectedValueException(
                'The upload directory can not be created because '
                . 'a file having the same name already exists!'
                );
            }
        } catch (Exception $exc) {
            echo $exc->getMessage();
            exit();
        }

        if (!is_dir($path)) {
            mkdir($path, self::UPLOAD_DIR_ACCESS_MODE, TRUE);
        }

        return $this;
    }

}

просмотры / тест / index.php

Обратите внимание на действие формы: http://[your-host]/test/upload. Он указывает на контроллер Test и метод upload. Я назвал метод upload, чтобы указать, что он предназначен для тестирования процесса загрузки. Хотя я должен был назвать его save или похожим, чтобы отразить тот факт, что некоторые данные должны быть сохранены, включая загруженные файлы.

<?php require APPROOT . '/views/inc/header.php'; ?>
<div class = "container">
    <div class = "row">
        <div class = "sm-12 col">

            <h2>Test upload</h2>

            <p>Submit the form</p>

            <form action = "<?php echo URLROOT; ?>/test/upload" method = "post" enctype = "multipart/form-data">
                <div class = "form-group">
                    <label for = "test_name">Test name <sup>*</sup></label>
                    <input type = "text" id = "test_name" name = "test_name" class = "form-control form-control-lg <?php echo empty($data['errors']['test_name']) ? '' : 'is-invalid'; ?>" value = "<?php echo $data['test_name'] ?? ''; ?>" />
                    <span class = "invalid-feedback"><?php echo $data['errors']['test_name'] ?? ''; ?></span>

                </div>
                <div class = "form-group">
                    <label for = "myFiles">Files <sup>*</sup></label></label>
                    <input type = "file" id = "myFiles" name = "files[]" multiple class = "form-control form-control-lg <?php echo empty($data['errors']['files']) ? '' : 'is-invalid'; ?>" />
                    <span class = "invalid-feedback"><?php echo empty($data['errors']['files']) ? '' : implode('<br/>', $data['errors']['files']); ?></span>
                </div>
                <input type = "submit" value = "Submit" class = "btn btn-success">
            </form>
        </div>
    </div>
</div>
<?php require APPROOT . '/views/inc/footer.php'; ?>

Для пользователей, которые, возможно, решат проголосовать против моего ответа: будьте честны и дайте мне знать мотивы вашего отрицательного голоса, чтобы я мог соответственно изменить свой ответ. Я открыт для любых предложений и критических замечаний. Спасибо.

dakis 19.08.2018 10:29

@AnthonyFink Привет, я вспомнил о некоторых дополнительных ресурсах. Поэтому я расширил список в своем ответе. Прочтите серию в указанном порядке. Удачи.

dakis 19.08.2018 14:06

Я поддержал ваш ответ. Но я думаю, что вопрос, требующий очень малых усилий, не заслуживает вашего очень обстоятельного ответа.

jrswgtr 19.08.2018 23:34

Спасибо, @jrswgtr. Может быть, в других ситуациях я бы так же думал. Но на этот раз я действительно оценил все усилия, которые Энтони вложил в свой проект.

dakis 20.08.2018 00:17

Я новичок в php и просто учусь. возможно, я действительно не знаю, как правильно задать вопрос, но каждый день ты узнаешь что-то новое. Хотелось бы, чтобы таких людей, как @dakis, было больше, они действительно помогают таким, как я.

Anthony Fink 20.08.2018 02:28

@jrswgtr я не могу поместить туда всю структуру моего php, возможно, она немного отличается от других структур mvc там.

Anthony Fink 20.08.2018 02:28

@AnthonyFink В самом деле, Энтони, обучение - это ключ. Взгляните также на это и это. Может быть, они тебе чем-нибудь помогут.

dakis 20.08.2018 13:07

Другие вопросы по теме