How can I upload media files inside the "app/code/Vendor/Module/web/images" directory? I am creating a custom form page on the admin page. In that form, I have created an image uploader component. Now I need to store the uploaded images inside the "app/code/Vendor/Module/web/images" directory.
This is my custom Model uploader which is I copied from "Magento\Catalog\Model\ImageUploader"
:
<?php
namespace Vendor\Module\Model;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\File\Uploader;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\File\Name;
use Magento\Framework\Filesystem;
use Magento\Framework\Filesystem\Directory\WriteInterface;
use Magento\MediaStorage\Helper\File\Storage\Database;
use Magento\MediaStorage\Model\File\UploaderFactory;
use Magento\Store\Model\StoreManagerInterface;
use Psr\Log\LoggerInterface;
/**
* Jason File Uploader
*/
class FileUploader
{
/**
* @var Database
*/
protected $coreFileStorageDatabase;
/**
* @var WriteInterface
*/
protected $mediaDirectory;
/**
* @var UploaderFactory
*/
private $uploaderFactory;
/**
* @var StoreManagerInterface
*/
protected $storeManager;
/**
* @var LoggerInterface
*/
protected $logger;
/**
* @var string
*/
protected $baseTmpPath;
/**
* @var string
*/
protected $basePath;
/**
* @var string
*/
protected $allowedExtensions;
/**
* @var string[]
*/
private $allowedMimeTypes;
/**
* @var Name
*/
private $fileNameLookup;
private $directoryKey;
/**
* ImageUploader constructor.
*
* @param Database $coreFileStorageDatabase
* @param Filesystem $filesystem
* @param UploaderFactory $uploaderFactory
* @param StoreManagerInterface $storeManager
* @param LoggerInterface $logger
* @param string $baseTmpPath
* @param string $basePath
* @param string[] $allowedExtensions
* @param string[] $allowedMimeTypes
* @param Name|null $fileNameLookup
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Database $coreFileStorageDatabase,
Filesystem $filesystem,
UploaderFactory $uploaderFactory,
StoreManagerInterface $storeManager,
LoggerInterface $logger,
$baseTmpPath,
$basePath,
$allowedExtensions,
$allowedMimeTypes = [],
Name $fileNameLookup = null
) {
$this->coreFileStorageDatabase = $coreFileStorageDatabase;
//$this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
//Here I tried to get my custom directory (app/code/Vendor/Module/web/images) instead of (DirectoryList::MEDIA)
$this->mediaDirectory = $filesystem->getDirectoryWrite('app/code/Vendor/Module/web/images');
$this->uploaderFactory = $uploaderFactory;
$this->storeManager = $storeManager;
$this->logger = $logger;
$this->baseTmpPath = $baseTmpPath;
$this->basePath = $basePath;
$this->allowedExtensions = $allowedExtensions;
$this->allowedMimeTypes = $allowedMimeTypes;
$this->fileNameLookup = $fileNameLookup ?? ObjectManager::getInstance()->get(Name::class);
}
/**
* 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 allowed extensions
*
* @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
* @param bool $returnRelativePath
* @return string
*
* @throws LocalizedException
*/
public function moveFileFromTmp($imageName, $returnRelativePath = false)
{
$baseTmpPath = $this->getBaseTmpPath();
$basePath = $this->getBasePath();
$baseImagePath = $this->getFilePath(
$basePath,
$this->fileNameLookup->getNewFileName(
$this->mediaDirectory->getAbsolutePath(
$this->getFilePath($basePath, $imageName)
)
)
);
$baseTmpImagePath = $this->getFilePath($baseTmpPath, $imageName);
try {
$this->coreFileStorageDatabase->copyFile(
$baseTmpImagePath,
$baseImagePath
);
$this->mediaDirectory->renameFile(
$baseTmpImagePath,
$baseImagePath
);
} catch (\Exception $e) {
$this->logger->critical($e);
throw new LocalizedException(__('Something went wrong while saving the file(s).'), $e);
}
return $returnRelativePath ? $baseImagePath : $imageName;
}
/**
* Checking file for saving and save it to tmp dir
*
* @param string $fileId
* @return string[]
*
* @throws LocalizedException
*/
public function saveFileToTmpDir($fileId)
{
$baseTmpPath = $this->getBaseTmpPath();
/** @var \Magento\MediaStorage\Model\File\Uploader $uploader */
$uploader = $this->uploaderFactory->create(['fileId' => $fileId]);
$uploader->setAllowedExtensions($this->getAllowedExtensions());
$uploader->setAllowRenameFiles(true);
if (!$uploader->checkMimeType($this->allowedMimeTypes)) {
throw new LocalizedException(__('File validation failed.'));
}
$result = $uploader->save($this->mediaDirectory->getAbsolutePath($baseTmpPath));
unset($result['path']);
if (!$result) {
throw new LocalizedException(__('File can not be saved to the destination folder.'));
}
/**
* Workaround for prototype 1.7 methods "isJSON", "evalJSON" on Windows OS
*/
$result['tmp_name'] = str_replace('\\', '/', $result['tmp_name']);
$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 LocalizedException(
__('Something went wrong while saving the file(s).'),
$e
);
}
}
return $result;
}
}
but the above code throwing error:
1 exception(s): Exception #0 (Magento\Framework\Exception\FileSystemException): Unknown directory type: 'app/code/Vendor/Module/web/images'
I have looked into the "Magento\Framework\App\Filesystem\DirectoryLists" class, which provides only a small amount of directories to upload the media files. In that class "app/code" directory was not found.
If anyone is aware of this please suggest me a solution to achieve my requirement. Thanks in advance!