{"id":123,"date":"2019-08-14T16:48:59","date_gmt":"2019-08-14T16:48:59","guid":{"rendered":"http:\/\/magebrew.com\/blog\/?p=123"},"modified":"2019-08-20T19:52:03","modified_gmt":"2019-08-20T19:52:03","slug":"add-image-upload-field-to-magento-2-ui-component-form","status":"publish","type":"post","link":"https:\/\/magebrew.com\/blog\/add-image-upload-field-to-magento-2-ui-component-form\/","title":{"rendered":"Add image upload field to Magento 2 UI component form"},"content":{"rendered":"\n<p>This post is about adding image upload field\/attribute to Admin CMS page.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Start with creating a new module. In our case it is Magebrew_ImageUploadFormField.  <\/p>\n\n\n\n<p>We need to add a new field for storing image path to <code>cms_page<\/code> table. Let&#8217;s use declarative schema for this purpose (available since Magento 2.3). Create <code>app\/code\/Magebrew\/ImageUploadFormField\/etc\/db_schema.xml<\/code> file with following content:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?xml version=\"1.0\"?>\n&lt;schema xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"urn:magento:framework:Setup\/Declaration\/Schema\/etc\/schema.xsd\">\n    &lt;table name=\"cms_page\" resource=\"default\" engine=\"innodb\" comment=\"CMS Page Table\">\n        &lt;column xsi:type=\"varchar\" name=\"banner_image\" nullable=\"true\" length=\"255\" comment=\"Banner Image\"\/>\n    &lt;\/table>\n&lt;\/schema><\/pre>\n\n\n\n<p>With declarative schema we also need to add <code>db_schema_whitelist<\/code>.json file:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n    \"cms_page\": {\n        \"column\": {\n            \"banner_image\": true\n        }\n    }\n}<\/pre>\n\n\n\n<p>After running <code>bin\/magento setup:upgrade<\/code> we should have new <code>banner_image<\/code> field added to <code>cms_page<\/code> table.<\/p>\n\n\n\n<p>Next step is to add field to form. Create <code>view\/adminhtml\/ui_component\/cms_page_form.xml<\/code> with the following code:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?xml version=\"1.0\"?>\n&lt;form xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"urn:magento:module:Magento_Ui:etc\/ui_configuration.xsd\">\n    &lt;fieldset name=\"general\">\n        &lt;field name=\"banner_image\">\n            &lt;argument name=\"data\" xsi:type=\"array\">\n                &lt;item name=\"config\" xsi:type=\"array\">\n                    &lt;item name=\"dataType\" xsi:type=\"string\">string&lt;\/item>\n                    &lt;item name=\"source\" xsi:type=\"string\">page&lt;\/item>\n                    &lt;item name=\"label\" xsi:type=\"string\" translate=\"true\">Banner Image&lt;\/item>\n                    &lt;item name=\"visible\" xsi:type=\"boolean\">true&lt;\/item>\n                    &lt;item name=\"formElement\" xsi:type=\"string\">fileUploader&lt;\/item>\n                    &lt;item name=\"elementTmpl\" xsi:type=\"string\">ui\/form\/element\/uploader\/uploader&lt;\/item>\n                    &lt;item name=\"previewTmpl\" xsi:type=\"string\">Magento_Catalog\/image-preview&lt;\/item>\n                    &lt;item name=\"baseTmpPath\" xsi:type=\"string\">cms\/tmp&lt;\/item>\n                    &lt;item name=\"required\" xsi:type=\"boolean\">false&lt;\/item>\n                    &lt;item name=\"sortOrder\" xsi:type=\"number\">60&lt;\/item>\n                    &lt;item name=\"uploaderConfig\" xsi:type=\"array\">\n                        &lt;item name=\"url\" xsi:type=\"url\" path=\"cmsbanner\/cmspage_banner\/upload\"\/>\n                    &lt;\/item>\n                &lt;\/item>\n            &lt;\/argument>\n        &lt;\/field>\n    &lt;\/fieldset>\n&lt;\/form><\/pre>\n\n\n\n<p>Now CMS page form should contain new field.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><a href=\"http:\/\/magebrew.com\/blog\/wp-content\/uploads\/2019\/08\/magento-image-upload-field-cms-page.png\"><img loading=\"lazy\" src=\"http:\/\/magebrew.com\/blog\/wp-content\/uploads\/2019\/08\/magento-image-upload-field-cms-page-1024x868.png\" alt=\"\" class=\"wp-image-132\" width=\"336\" height=\"284\" srcset=\"https:\/\/magebrew.com\/blog\/wp-content\/uploads\/2019\/08\/magento-image-upload-field-cms-page-1024x868.png 1024w, https:\/\/magebrew.com\/blog\/wp-content\/uploads\/2019\/08\/magento-image-upload-field-cms-page-300x254.png 300w, https:\/\/magebrew.com\/blog\/wp-content\/uploads\/2019\/08\/magento-image-upload-field-cms-page-768x651.png 768w, https:\/\/magebrew.com\/blog\/wp-content\/uploads\/2019\/08\/magento-image-upload-field-cms-page.png 1302w\" sizes=\"(max-width: 336px) 100vw, 336px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Next we create image uploader model where we define some settings and how image is saved. File <code>Model\/BannerUploader.php<\/code><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"git\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\ndeclare(strict_types=1);\n\nnamespace Magebrew\\ImageUploadFormField\\Model;\n\nuse Magento\\Framework\\App\\Filesystem\\DirectoryList;\nuse Magento\\Framework\\Exception\\LocalizedException;\nuse Magento\\Framework\\Filesystem;\nuse Magento\\Framework\\UrlInterface;\nuse Magento\\MediaStorage\\Helper\\File\\Storage\\Database;\nuse Magento\\MediaStorage\\Model\\File\\UploaderFactory;\nuse Magento\\Store\\Model\\StoreManagerInterface;\nuse Psr\\Log\\LoggerInterface;\n\n\/**\n * Class BannerUploader\n *\/\nclass BannerUploader\n{\n    \/**\n     * @var string\n     *\/\n    const IMAGE_TMP_PATH = 'cmsbanner\/tmp';\n\n    \/**\n     * @var string\n     *\/\n    const IMAGE_PATH = 'cmsbanner';\n\n    \/**\n     * @var string\n     *\/\n    const FILE_TMP_PATH = 'cmsbanner\/tmp\/images\/file';\n\n    \/**\n     * @var string\n     *\/\n    const FILE_PATH = 'cmsbanner\/images\/file';\n\n    \/**\n     * Core file storage database\n     *\n     * @var \\Magento\\MediaStorage\\Helper\\File\\Storage\\Database\n     *\/\n    protected $coreFileStorageDatabase;\n\n    \/**\n     * Media directory object (writable).\n     *\n     * @var \\Magento\\Framework\\Filesystem\\Directory\\WriteInterface\n     *\/\n    protected $mediaDirectory;\n\n    \/**\n     * Store manager\n     *\n     * @var \\Magento\\Store\\Model\\StoreManagerInterface\n     *\/\n    protected $storeManager;\n\n    \/**\n     * @var \\Psr\\Log\\LoggerInterface\n     *\/\n    protected $logger;\n\n    \/**\n     * Base tmp path\n     *\n     * @var string\n     *\/\n    protected $baseTmpPath;\n\n    \/**\n     * Base path\n     *\n     * @var string\n     *\/\n    protected $basePath;\n\n    \/**\n     * Allowed extensions\n     *\n     * @var string\n     *\/\n    protected $allowedExtensions;\n\n    \/**\n     * Uploader factory\n     *\n     * @var \\Magento\\MediaStorage\\Model\\File\\UploaderFactory\n     *\/\n    private $uploaderFactory;\n\n    \/**\n     * @param Database $coreFileStorageDatabase\n     * @param Filesystem $filesystem\n     * @param UploaderFactory $uploaderFactory\n     * @param StoreManagerInterface $storeManager\n     * @param LoggerInterface $logger\n     * @param $baseTmpPath\n     * @param $basePath\n     * @param array $allowedExtensions\n     * @throws \\Magento\\Framework\\Exception\\FileSystemException\n     *\/\n    public function __construct(\n        Database $coreFileStorageDatabase,\n        Filesystem $filesystem,\n        UploaderFactory $uploaderFactory,\n        StoreManagerInterface $storeManager,\n        LoggerInterface $logger,\n        $baseTmpPath,\n        $basePath,\n        $allowedExtensions = []\n    ) {\n        $this->coreFileStorageDatabase = $coreFileStorageDatabase;\n        $this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);\n        $this->uploaderFactory = $uploaderFactory;\n        $this->storeManager = $storeManager;\n        $this->logger = $logger;\n        $this->baseTmpPath = $baseTmpPath;\n        $this->basePath = $basePath;\n        $this->allowedExtensions = $allowedExtensions;\n    }\n\n    \/**\n     * Retrieve base tmp path\n     *\n     * @return string\n     *\/\n    public function getBaseTmpPath()\n    {\n        return $this->baseTmpPath;\n    }\n\n    \/**\n     * Set base tmp path\n     *\n     * @param string $baseTmpPath\n     *\n     * @return void\n     *\/\n    public function setBaseTmpPath($baseTmpPath)\n    {\n        $this->baseTmpPath = $baseTmpPath;\n    }\n\n    \/**\n     * Retrieve base path\n     *\n     * @return string\n     *\/\n    public function getBasePath()\n    {\n        return $this->basePath;\n    }\n\n    \/**\n     * Set base path\n     *\n     * @param string $basePath\n     *\n     * @return void\n     *\/\n    public function setBasePath($basePath)\n    {\n        $this->basePath = $basePath;\n    }\n\n    \/**\n     * Retrieve base path\n     *\n     * @return string[]\n     *\/\n    public function getAllowedExtensions()\n    {\n        return $this->allowedExtensions;\n    }\n\n    \/**\n     * Set allowed extensions\n     *\n     * @param string[] $allowedExtensions\n     *\n     * @return void\n     *\/\n    public function setAllowedExtensions($allowedExtensions)\n    {\n        $this->allowedExtensions = $allowedExtensions;\n    }\n\n    \/**\n     * Retrieve path\n     *\n     * @param string $path\n     * @param string $name\n     *\n     * @return string\n     *\/\n    public function getFilePath($path, $name)\n    {\n        return rtrim($path, '\/') . '\/' . ltrim($name, '\/');\n    }\n\n    \/**\n     * Checking file for moving and move it\n     *\n     * @param string $name\n     * @return string\n     * @throws \\Magento\\Framework\\Exception\\LocalizedException\n     *\/\n    public function moveFileFromTmp($name)\n    {\n        $baseTmpPath = $this->getBaseTmpPath();\n        $basePath = $this->getBasePath();\n        $baseFilePath = $this->getFilePath($basePath, $name);\n        $baseTmpFilePath = $this->getFilePath($baseTmpPath, $name);\n\n        try {\n            $this->coreFileStorageDatabase->copyFile(\n                $baseTmpFilePath,\n                $baseFilePath\n            );\n            $this->mediaDirectory->renameFile(\n                $baseTmpFilePath,\n                $baseFilePath\n            );\n        } catch (\\Exception $e) {\n            throw new LocalizedException(\n                __('Something went wrong while saving the file(s).')\n            );\n        }\n\n        return $name;\n    }\n\n    public function getBaseUrl()\n    {\n        return $this->storeManager\n            ->getStore()\n            ->getBaseUrl(\n                UrlInterface::URL_TYPE_MEDIA\n            );\n    }\n\n    \/**\n     * Checking file for save and save it to tmp dir\n     *\n     * @param string $fileId\n     * @return string[]\n     * @throws \\Magento\\Framework\\Exception\\LocalizedException\n     *\/\n    public function saveFileToTmpDir($fileId)\n    {\n        $baseTmpPath = $this->getBaseTmpPath();\n\n        $uploader = $this->uploaderFactory->create(['fileId' => $fileId]);\n        $uploader->setAllowedExtensions($this->getAllowedExtensions());\n        $uploader->setAllowRenameFiles(true);\n        $uploader->setFilesDispersion(false);\n\n        $result = $uploader->save($this->mediaDirectory->getAbsolutePath($baseTmpPath));\n\n        if (!$result) {\n            throw new LocalizedException(\n                __('File can not be saved to the destination folder.')\n            );\n        }\n        \/**\n         * Workaround for prototype 1.7 methods \"isJSON\", \"evalJSON\" on Windows OS\n         *\/\n        $result['tmp_name'] = str_replace('\\\\', '\/', $result['tmp_name']);\n        $result['path'] = str_replace('\\\\', '\/', $result['path']);\n        $result['url'] = $this->getBaseUrl() . $this->getFilePath($baseTmpPath, $result['file']);\n\n        if (isset($result['file'])) {\n            try {\n                $relativePath = rtrim($baseTmpPath, '\/') . '\/' . ltrim($result['file'], '\/');\n                $this->coreFileStorageDatabase->saveFile($relativePath);\n            } catch (\\Exception $e) {\n                $this->logger->critical($e);\n                throw new LocalizedException(\n                    __('Something went wrong while saving the file(s).')\n                );\n            }\n        }\n\n        return $result;\n    }\n\n    \/**\n     * @param $input\n     * @param $data\n     * @return string\n     *\/\n    public function uploadFileAndGetName($input, $data)\n    {\n        if (!isset($data[$input])) {\n            return '';\n        }\n        if (is_array($data[$input]) &amp;&amp; !empty($data[$input]['delete'])) {\n            return '';\n        }\n\n        if (isset($data[$input][0]['name']) &amp;&amp; isset($data[$input][0]['tmp_name'])) {\n            try {\n                $result = $this->moveFileFromTmp($data[$input][0]['file']);\n                return $result;\n            } catch (\\Exception $e) {\n                return '';\n            }\n        } elseif (isset($data[$input][0]['name'])) {\n            return $data[$input][0]['name'];\n        }\n        return '';\n    }\n}\n<\/pre>\n\n\n\n<p>Uploader is used in controller that responsible for saving image in filesystem. File <code>Controller\/Adminhtml\/Cmspage\/Banner\/Upload.php<\/code><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\ndeclare(strict_types=1);\n\nnamespace Magebrew\\ImageUploadFormField\\Controller\\Adminhtml\\Cmspage\\Banner;\n\nuse Magebrew\\ImageUploadFormField\\Model\\BannerUploader;\nuse Magento\\Backend\\App\\Action;\nuse Magento\\Backend\\App\\Action\\Context;\nuse Magento\\Framework\\Controller\\ResultFactory;\n\n\/**\n * Class Upload\n *\/\nclass Upload extends Action\n{\n    \/**\n     * @var string\n     *\/\n    const ACTION_RESOURCE = 'Magebrew_ImageUploadFormField::imageuploadfield';\n\n    \/**\n     * @var BannerUploader\n     *\/\n    protected $uploader;\n\n    \/**\n     * Upload constructor.\n     *\n     * @param Context $context\n     * @param BannerUploader $uploader\n     *\/\n    public function __construct(\n        Context $context,\n        BannerUploader $uploader\n    ) {\n        parent::__construct($context);\n        $this->uploader = $uploader;\n    }\n\n    \/**\n     * Upload file controller action\n     *\n     * @return \\Magento\\Framework\\Controller\\ResultInterface\n     *\/\n    public function execute()\n    {\n        try {\n            $result = $this->uploader->saveFileToTmpDir('banner_image');\n\n            $result['cookie'] = [\n                'name'     => $this->_getSession()->getName(),\n                'value'    => $this->_getSession()->getSessionId(),\n                'lifetime' => $this->_getSession()->getCookieLifetime(),\n                'path'     => $this->_getSession()->getCookiePath(),\n                'domain'   => $this->_getSession()->getCookieDomain(),\n            ];\n        } catch (\\Exception $e) {\n            $result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()];\n        }\n        return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData($result);\n    }\n\n    \/**\n     * @return string\n     *\/\n    protected function getFieldName()\n    {\n        return $this->_request->getParam('banner_image');\n    }\n}\n<\/pre>\n\n\n\n<p>To inject uploader model to controller we define virtual type in <code>di.xml<\/code>. File <code>etc\/di.xml<\/code><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?xml version=\"1.0\"?>\n\n&lt;config xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"urn:magento:framework:ObjectManager\/etc\/config.xsd\">\n    &lt;virtualType name=\"MagebrewBannerUploader\" type=\"Magebrew\\ImageUploadFormField\\Model\\BannerUploader\">\n        &lt;arguments>\n            &lt;argument name=\"baseTmpPath\" xsi:type=\"const\">Magebrew\\ImageUploadFormField\\Model\\BannerUploader::IMAGE_TMP_PATH&lt;\/argument>\n            &lt;argument name=\"basePath\" xsi:type=\"const\">Magebrew\\ImageUploadFormField\\Model\\BannerUploader::IMAGE_PATH&lt;\/argument>\n            &lt;argument name=\"allowedExtensions\" xsi:type=\"array\">\n                &lt;item name=\"jpg\" xsi:type=\"string\">jpg&lt;\/item>\n                &lt;item name=\"jpeg\" xsi:type=\"string\">jpeg&lt;\/item>\n                &lt;item name=\"gif\" xsi:type=\"string\">gif&lt;\/item>\n                &lt;item name=\"png\" xsi:type=\"string\">png&lt;\/item>\n            &lt;\/argument>\n        &lt;\/arguments>\n    &lt;\/virtualType>\n    &lt;type name=\"Magebrew\\ImageUploadFormField\\Controller\\Adminhtml\\Cmspage\\Banner\\Upload\">\n        &lt;arguments>\n            &lt;argument name=\"uploader\" xsi:type=\"object\">MagebrewBannerUploader&lt;\/argument>\n        &lt;\/arguments>\n    &lt;\/type>\n&lt;\/config><\/pre>\n\n\n\n<p>Now we need to take care of saving banner image path to <code>cms_page<\/code> table on CMS page save and retrieving existing banner image in Admin CMS form. For this purpose we create plugin for <code>Magento\\Cms\\Model\\PageRepository<\/code> and <code>Magento\\Cms\\Model\\Page\\DataProvider<\/code>. Here is how <code>etc\/adminhtml\/di.xml<\/code> file looks like:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"xml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?xml version=\"1.0\"?>\n\n&lt;config xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"urn:magento:framework:ObjectManager\/etc\/config.xsd\">\n    &lt;type name=\"Magento\\Cms\\Model\\PageRepository\">\n        &lt;plugin name=\"magebrew_save_banner_image\" type=\"Magebrew\\ImageUploadFormField\\Plugin\\Cms\\Model\\PageRepository\\BeforeSave\\SaveBannerImagePlugin\" \/>\n    &lt;\/type>\n    &lt;type name=\"Magebrew\\ImageUploadFormField\\Plugin\\Cms\\Model\\PageRepository\\BeforeSave\\SaveBannerImagePlugin\">\n        &lt;arguments>\n            &lt;argument name=\"uploader\" xsi:type=\"object\">MagebrewBannerUploader&lt;\/argument>\n        &lt;\/arguments>\n    &lt;\/type>\n    &lt;type name=\"Magento\\Cms\\Model\\Page\\DataProvider\">\n        &lt;plugin name=\"magebrew_add_banner_image_to_form\" type=\"Magebrew\\ImageUploadFormField\\Plugin\\Cms\\Model\\Page\\DataProvider\\AfterGetData\\ModifyBannerDataPlugin\"\/>\n    &lt;\/type>\n&lt;\/config><\/pre>\n\n\n\n<p>SaveBannerImagePlugin, file <code>Plugin\/Cms\/Model\/PageRepository\/BeforeSave\/SaveBannerImagePlugin.php<\/code><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\ndeclare(strict_types=1);\n\nnamespace Magebrew\\ImageUploadFormField\\Plugin\\Cms\\Model\\PageRepository\\BeforeSave;\n\nuse Magebrew\\ImageUploadFormField\\Model\\BannerUploader;\nuse Magento\\Cms\\Api\\Data\\PageInterface;\nuse Magento\\Cms\\Model\\PageRepository;\nuse Magento\\Framework\\App\\RequestInterface;\n\n\/**\n * Class SaveBannerImagePlugin\n *\/\nclass SaveBannerImagePlugin\n{\n    \/**\n     * @var BannerUploader\n     *\/\n    private $uploader;\n\n    \/**\n     * @var RequestInterface\n     *\/\n    private $request;\n\n    \/**\n     * SaveBannerImagePlugin constructor.\n     * @param RequestInterface $request\n     * @param BannerUploader $uploader\n     *\/\n    public function __construct(\n        RequestInterface $request,\n        BannerUploader $uploader\n    ) {\n        $this->uploader = $uploader;\n        $this->request = $request;\n    }\n\n    \/**\n     * Save\n     *\n     * @param PageRepository $subject\n     * @param PageInterface $page\n     * @return array\n     * @throws \\Magento\\Framework\\Exception\\LocalizedException\n     *\/\n    public function beforeSave(\n        PageRepository $subject,\n        PageInterface $page\n    ): array {\n        $data = $page->getData();\n        $key = 'banner_image';\n\n        if (isset($data[$key]) &amp;&amp; is_array($data[$key])) {\n            if (!empty($data[$key]['delete'])) {\n                $data[$key] = null;\n            } else {\n                if (isset($data[$key][0]['name']) &amp;&amp; isset($data[$key][0]['tmp_name'])) {\n                    $image = $data[$key][0]['name'];\n\n                    $image = $this->uploader->moveFileFromTmp($image);\n                    $data[$key] = $image;\n                } else {\n                    if (isset($data[$key][0]['url'])) {\n                        $data[$key] = basename($data[$key][0]['url']);\n                    }\n                }\n            }\n\n            $page->setData($data);\n        } else {\n            $data[$key] = null;\n        }\n\n        return [$page];\n    }\n}\n<\/pre>\n\n\n\n<p>ModifyBannerDataPlugin, file <code>Plugin\/Cms\/Model\/Page\/DataProvider\/AfterGetData\/ModifyBannerDataPlugin.php<\/code><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\ndeclare(strict_types=1);\n\nnamespace Magebrew\\ImageUploadFormField\\Plugin\\Cms\\Model\\Page\\DataProvider\\AfterGetData;\n\nuse Magebrew\\ImageUploadFormField\\Model\\BannerUploader;\nuse Magento\\Cms\\Model\\Page\\DataProvider;\nuse Magento\\Framework\\UrlInterface;\nuse Magento\\Store\\Model\\StoreManagerInterface;\n\n\/**\n * Class ModifyBannerDataPlugin\n *\/\nclass ModifyBannerDataPlugin\n{\n    \/**\n     * @var StoreManagerInterface\n     *\/\n    private $storeManager;\n\n    \/**\n     * ModifyBannerDataPlugin constructor.\n     * @param StoreManagerInterface $storeManager\n     *\/\n    public function __construct(StoreManagerInterface $storeManager)\n    {\n        $this->storeManager = $storeManager;\n    }\n\n    \/**\n     * @param DataProvider $subject\n     * @param $loadedData\n     * @return array\n     * @throws \\Magento\\Framework\\Exception\\NoSuchEntityException\n     *\/\n    public function afterGetData(\n        DataProvider $subject,\n        $loadedData\n    ) {\n        \/** @var array $loadedData *\/\n        if (is_array($loadedData) &amp;&amp; count($loadedData) == 1) {\n            foreach ($loadedData as $key => $item) {\n                if (isset($item['banner_image']) &amp;&amp; $item['banner_image']) {\n                    $imageArr = [];\n                    $imageArr[0]['name'] = 'Image';\n                    $imageArr[0]['url'] = $this->storeManager->getStore()\n                            ->getBaseUrl(UrlInterface::URL_TYPE_MEDIA) .\n                        BannerUploader::IMAGE_PATH . DIRECTORY_SEPARATOR . $item['banner_image'];\n                    $loadedData[$key]['banner_image'] = $imageArr;\n                }\n            }\n        }\n\n        return $loadedData;\n    }\n}\n<\/pre>\n\n\n\n<p>Actually that is it. Now we should have ability to upload and save CMS page banner image.  If you also need instructions on how to display this banner on storefront check complete module on <a href=\"https:\/\/github.com\/magebrew\/magento-image-upload-field\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post is about adding image upload field\/attribute to Admin CMS page.<\/p>\n","protected":false},"author":1,"featured_media":157,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[19],"tags":[25,26,24,20,23],"_links":{"self":[{"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/posts\/123"}],"collection":[{"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/comments?post=123"}],"version-history":[{"count":31,"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/posts\/123\/revisions"}],"predecessor-version":[{"id":156,"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/posts\/123\/revisions\/156"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/media\/157"}],"wp:attachment":[{"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/media?parent=123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/categories?post=123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/magebrew.com\/blog\/wp-json\/wp\/v2\/tags?post=123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}