Magento 2 : Missing required argument $baseTmpPath

I used image uploader in ui form. But, when I save image not saved in main folder and return error

Missing required argument $ baseTmpPath of Vendor\Module\Model\ImageUploader.

My Files code :

di.xml :

<!-- Image Uploader -->     <virtualType name="VendorModuleModelImageUploader" type="Vendor\Module\Model\ImageUploader">         <arguments>             <argument name="baseTmpPath" xsi:type="string">test/tmp/image</argument>             <argument name="basePath" xsi:type="string">test/image</argument>             <argument name="allowedExtensions" xsi:type="array">                 <item name="jpg" xsi:type="string">jpg</item>                 <item name="jpeg" xsi:type="string">jpeg</item>                 <item name="gif" xsi:type="string">gif</item>                 <item name="png" xsi:type="string">png</item>             </argument>         </arguments>     </virtualType>     <type name="Vendor\Module\Controller\Adminhtml\Test\Upload">         <arguments>             <argument name="imageUploader" xsi:type="object">VendorModuleModelImageUploader</argument>         </arguments>     </type>     <!-- End Image Uploader --> 

ImageUploader.php :

<?php /**  * Copyright © Magento, Inc. All rights reserved.  * See COPYING.txt for license details.  */  namespace Vendor\Module\Model;  /**  * Catalog image uploader  */ class ImageUploader {     /**      * Core file storage database      *      * @var \Magento\MediaStorage\Helper\File\Storage\Database      */     protected $  coreFileStorageDatabase;      /**      * Media directory object (writable).      *      * @var \Magento\Framework\Filesystem\Directory\WriteInterface      */     protected $  mediaDirectory;      /**      * Uploader factory      *      * @var \Magento\MediaStorage\Model\File\UploaderFactory      */     private $  uploaderFactory;      /**      * Store manager      *      * @var \Magento\Store\Model\StoreManagerInterface      */     protected $  storeManager;      /**      * @var \Psr\Log\LoggerInterface      */     protected $  logger;      /**      * Base tmp path      *      * @var string      */     protected $  baseTmpPath;      /**      * Base path      *      * @var string      */     protected $  basePath;      /**      * Allowed extensions      *      * @var string      */     protected $  allowedExtensions;      /**      * ImageUploader constructor      *      * @param \Magento\MediaStorage\Helper\File\Storage\Database $  coreFileStorageDatabase      * @param \Magento\Framework\Filesystem $  filesystem      * @param \Magento\MediaStorage\Model\File\UploaderFactory $  uploaderFactory      * @param \Magento\Store\Model\StoreManagerInterface $  storeManager      * @param \Psr\Log\LoggerInterface $  logger      * @param string $  baseTmpPath      * @param string $  basePath      * @param string[] $  allowedExtensions      */     public function __construct(         \Magento\MediaStorage\Helper\File\Storage\Database $  coreFileStorageDatabase,         \Magento\Framework\Filesystem $  filesystem,         \Magento\MediaStorage\Model\File\UploaderFactory $  uploaderFactory,         \Magento\Store\Model\StoreManagerInterface $  storeManager,         \Psr\Log\LoggerInterface $  logger,         $  baseTmpPath,         $  basePath,         $  allowedExtensions     ) {         $  this->coreFileStorageDatabase = $  coreFileStorageDatabase;         $  this->mediaDirectory = $  filesystem->getDirectoryWrite(\Magento\Framework\App\Filesystem\DirectoryList::MEDIA);         $  this->uploaderFactory = $  uploaderFactory;         $  this->storeManager = $  storeManager;         $  this->logger = $  logger;         $  this->baseTmpPath = $  baseTmpPath;         $  this->basePath = $  basePath;         $  this->allowedExtensions = $  allowedExtensions;     }      /**      * Set base tmp path      *      * @param string $  baseTmpPath      *      * @return void      */     public function setBaseTmpPath($  baseTmpPath) {         $  this->baseTmpPath = $  baseTmpPath;     }      /**      * Set base path      *      * @param string $  basePath      *      * @return void      */     public function setBasePath($  basePath) {         $  this->basePath = $  basePath;     }      /**      * Set allowed extensions      *      * @param string[] $  allowedExtensions      *      * @return void      */     public function setAllowedExtensions($  allowedExtensions) {         $  this->allowedExtensions = $  allowedExtensions;     }      /**      * Retrieve base tmp path      *      * @return string      */     public function getBaseTmpPath() {         return $  this->baseTmpPath;     }      /**      * Retrieve base path      *      * @return string      */     public function getBasePath() {         return $  this->basePath;     }      /**      * Retrieve base path      *      * @return string[]      */     public function getAllowedExtensions() {         return $  this->allowedExtensions;     }      /**      * Retrieve path      *      * @param string $  path      * @param string $  imageName      *      * @return string      */     public function getFilePath($  path, $  imageName) {         return rtrim($  path, '/') . '/' . ltrim($  imageName, '/');     }      /**      * Checking file for moving and move it      *      * @param string $  imageName      *      * @return string      *      * @throws \Magento\Framework\Exception\LocalizedException      */     public function moveFileFromTmp($  imageName) {         $  baseTmpPath = $  this->getBaseTmpPath();         $  basePath = $  this->getBasePath();          $  baseImagePath = $  this->getFilePath($  basePath, $  imageName);         $  baseTmpImagePath = $  this->getFilePath($  baseTmpPath, $  imageName);          try {             $  this->coreFileStorageDatabase->copyFile(                 $  baseTmpImagePath,                 $  baseImagePath             );             $  this->mediaDirectory->renameFile($  baseTmpImagePath, $  baseImagePath);         } catch (\Exception $  e) {             throw new \Magento\Framework\Exception\LocalizedException(                 __('Something went wrong while saving the file(s).')             );         }          return $  imageName;     }      /**      * Checking file for save and save it to tmp dir      *      * @param string $  fileId      *      * @return string[]      *      * @throws \Magento\Framework\Exception\LocalizedException      */     public function saveFileToTmpDir($  fileId) {         $  baseTmpPath = $  this->getBaseTmpPath();         $  uploader = $  this->uploaderFactory->create(['fileId' => $  fileId]);         $  uploader->setAllowedExtensions($  this->getAllowedExtensions());         $  uploader->setAllowRenameFiles(true);          $  result = $  uploader->save($  this->mediaDirectory->getAbsolutePath($  baseTmpPath));          if (!$  result) {             throw new \Magento\Framework\Exception\LocalizedException(                 __('File can not be saved to the destination folder.')             );         }          $  result['tmp_name'] = str_replace('\', '/', $  result['tmp_name']);         $  result['path'] = str_replace('\', '/', $  result['path']);         $  result['url'] = $  this->storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . $  this->getFilePath($  baseTmpPath, $  result['file']);         $  result['name'] = $  result['file'];          if (isset($  result['file'])) {             try {                 $  relativePath = rtrim($  baseTmpPath, '/') . '/' . ltrim($  result['file'], '/');                 $  this->coreFileStorageDatabase->saveFile($  relativePath);             } catch (\Exception $  e) {                 $  this->logger->critical($  e);                 throw new \Magento\Framework\Exception\LocalizedException(                     __('Something went wrong while saving the file(s).')                 );             }         }          return $  result;     } } 

Save.php :

private function imageSaveToDir(array $  rawData) {     $  data = $  rawData;     if (isset($  data['review_image'][0]['name']) && isset($  data['review_image'][0]['tmp_name'])) {         $  data['review_image'] = $  data['review_image'][0]['name'];         /**  \Vendor\Module\Model\ImageUploader $  imageUploader*/         $  this->imageUploader->moveFileFromTmp($  data['review_image']);     } elseif (isset($  data['review_image'][0]['image']) && !isset($  data['review_image'][0]['tmp_name'])) {         $  data['review_image'] = $  data['review_image'][0]['image'];     } else {         $  data['review_image'] = null;     }     return $  data; } 

DataProvider.php :

if (!$  this->loadedData) {             $  storeId = (int) $  this->request->getParam('store');             $  this->collection->setStoreId($  storeId)->addAttributeToSelect('*');             $  items = $  this->collection->getItems();             foreach ($  items as $  item) {                 $  itemData = $  item->getData();                 $  imageName = $  itemData['review_image'];                 $  itemData['review_image'] = array(                     [                         'name' => $  imageName,                         'url' => $  this->storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'test/image/' . $  imageName,                     ],                 );                 $  item->setStoreId($  storeId);                 $  this->loadedData[$  item->getEntityId()] = $  itemData;                 break;             }         } 

Upload.php :

public function execute() {         $  imageUploadId = $  this->_request->getParam('param_name', 'review_image');         try {             $  this->imageUploader->setBaseTmpPath('test/tmp/image');             $  this->imageUploader->setBasePath('test/image');             $  imageResult = $  this->imageUploader->saveFileToTmpDir($  imageUploadId);              $  imageResult['cookie'] = [                 'name' => $  this->_getSession()->getName(),                 'value' => $  this->_getSession()->getSessionId(),                 'lifetime' => $  this->_getSession()->getCookieLifetime(),                 'path' => $  this->_getSession()->getCookiePath(),                 'domain' => $  this->_getSession()->getCookieDomain(),             ];         } catch (\Exception $  e) {             $  imageResult = ['error' => $  e->getMessage(), 'errorcode' => $  e->getCode()];         }         return $  this->resultFactory->create(ResultFactory::TYPE_JSON)->setData($  imageResult);     } 

What I missing here?

Please help me.

Thanks.