3

I am facing issue uploading multiple images.i have implemented single image upload in Magento 2.3 from the admin side using the UI component. Thanks for your help my code is given below.

form code

 <field name="restorent_images">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="dataType" xsi:type="string">string</item>
 <item name="source" xsi:type="string">geolocation</item>
 <item name="label" xsi:type="string" translate="true">Image Of Restorent</item>
 <item name="visible" xsi:type="boolean">true</item>
 <item name="formElement" xsi:type="string">fileUploader</item>
 <item name="previewTmpl" xsi:type="string">Magento_Catalog/image-preview</item>
 <item name="elementTmpl" xsi:type="string">ui/form/element/uploader/uploader</item>
 <!-- <item name="isMultipleFiles" xsi:type="boolean">true</item> -->
 <item name="dataScope" xsi:type="string">image</item>
 <item name="uploaderConfig" xsi:type="array">
 <item name="url" xsi:type="url" path="ranosys_giolocation/index/upload"/>
 </item>
 </item>
 </argument>
 </field> 

controller

 <?php
namespace Ranosys\GioLocation\Controller\Adminhtml\Index;
use Magento\Framework\Controller\ResultFactory;
/**
 * Class Upload
 */
class Upload extends \Magento\Backend\App\Action
{
 /**
 * Image uploader
 *
 * @var \Magento\Catalog\Model\ImageUploader
 */
 protected $imageUploader;
 /**
 * Upload constructor.
 *
 * @param \Magento\Backend\App\Action\Context $context
 * @param \Magento\Catalog\Model\ImageUploader $imageUploader
 */
 public function __construct(
 \Magento\Backend\App\Action\Context $context,
 \Ranosys\GioLocation\Model\ImageUploader $imageUploader
 ) {
 parent::__construct($context);
 $this->imageUploader = $imageUploader;
 }
 /**
 * Check admin permissions for this controller
 *
 * @return boolean
 */
 protected function _isAllowed()
 {
 return $this->_authorization->isAllowed('Ranosys_GioLocation::ranosys_gioLocation');
 }
 /**
 * Upload file controller action
 *
 * @return \Magento\Framework\Controller\ResultInterface
 */
 public function execute()
 {
 try {
 $result = $this->imageUploader->saveFileToTmpDir('restorent_images');
 } catch (\Exception $e) {
 $result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()];
 }
 return $this->resultFactory->create(ResultFactory::TYPE_JSON)->setData($result);
 }
}

model

 <?php
namespace Ranosys\GioLocation\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;
 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;
 }
 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;
 }
}
Aasim Goriya
5,4622 gold badges30 silver badges54 bronze badges
asked Feb 12, 2019 at 5:13
4
  • can you please share your code and provide error you are getting ? Commented Feb 12, 2019 at 5:26
  • ok I had code for single image upload but i need to do multiple i will update code Commented Feb 12, 2019 at 5:37
  • @AasimGoriya i have updated code Commented Feb 12, 2019 at 5:58
  • please check my ans Commented Feb 12, 2019 at 8:14

2 Answers 2

1

Please use imageUploader instead of fileUploader in your form code xml.

<item name="formElement" xsi:type="string">imageUploader</item>

So your code is look like below

<field name="restorent_images">
 <argument name="data" xsi:type="array">
 <item name="config" xsi:type="array">
 <item name="dataType" xsi:type="string">string</item>
 <item name="source" xsi:type="string">geolocation</item>
 <item name="label" xsi:type="string" translate="true">Image Of Restorent</item>
 <item name="visible" xsi:type="boolean">true</item>
 <item name="formElement" xsi:type="string">imageUploader</item>
 <item name="previewTmpl" xsi:type="string">Magento_Catalog/image-preview</item>
 <item name="elementTmpl" xsi:type="string">ui/form/element/uploader/uploader</item>
 <!-- <item name="isMultipleFiles" xsi:type="boolean">true</item> -->
 <item name="dataScope" xsi:type="string">image</item>
 <item name="uploaderConfig" xsi:type="array">
 <item name="url" xsi:type="url" path="ranosys_giolocation/index/upload"/>
 </item>
 </item>
 </argument>
 </field> 
answered Feb 12, 2019 at 8:10
13
  • i have added that but i want for multiple files Commented Feb 12, 2019 at 9:01
  • are you not able to see add to Gallery button after this change ? Commented Feb 12, 2019 at 9:25
  • its coming like this imgur.com/7aRuIcY Commented Feb 12, 2019 at 9:36
  • I assume that you are using fileUploader right ? Commented Feb 12, 2019 at 9:45
  • ooh, I got. but how will be saving image path to database Commented Feb 12, 2019 at 9:48
0

In the Class Upload, Add this line before try catch

$imageId = $this->_request->getParam('param_name', 'restorent_images');

And replace this line

$result = $this->imageUploader->saveFileToTmpDir('restorent_images');

With

$result = $this->imageUploader->saveFileToTmpDir($imageId);
answered Sep 24, 2019 at 11:58

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.