FileProcessor.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Theme\Model\Design\Config\FileUploader;
  7. use Magento\Framework\Exception\LocalizedException;
  8. use Magento\Framework\Filesystem;
  9. use Magento\MediaStorage\Model\File\UploaderFactory;
  10. use Magento\Theme\Model\Design\Backend\File;
  11. use Magento\Theme\Model\Design\BackendModelFactory;
  12. use Magento\Theme\Model\Design\Config\MetadataProvider;
  13. use Magento\Framework\App\Filesystem\DirectoryList;
  14. use Magento\Framework\Filesystem\Directory\WriteInterface;
  15. use Magento\Framework\UrlInterface;
  16. use Magento\Store\Model\StoreManagerInterface;
  17. /**
  18. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  19. */
  20. class FileProcessor
  21. {
  22. /**
  23. * @var UploaderFactory
  24. */
  25. protected $uploaderFactory;
  26. /**
  27. * @var BackendModelFactory
  28. */
  29. protected $backendModelFactory;
  30. /**
  31. * @var MetadataProvider
  32. */
  33. protected $metadataProvider;
  34. /**
  35. * Media Directory object (writable).
  36. *
  37. * @var WriteInterface
  38. */
  39. protected $mediaDirectory;
  40. /**
  41. * @var StoreManagerInterface
  42. */
  43. protected $storeManager;
  44. /**
  45. * @var string
  46. */
  47. const FILE_DIR = 'design/file';
  48. /**
  49. * @param UploaderFactory $uploaderFactory
  50. * @param BackendModelFactory $backendModelFactory
  51. * @param MetadataProvider $metadataProvider
  52. * @param Filesystem $filesystem
  53. * @param StoreManagerInterface $storeManager
  54. */
  55. public function __construct(
  56. UploaderFactory $uploaderFactory,
  57. BackendModelFactory $backendModelFactory,
  58. MetadataProvider $metadataProvider,
  59. Filesystem $filesystem,
  60. StoreManagerInterface $storeManager
  61. ) {
  62. $this->uploaderFactory = $uploaderFactory;
  63. $this->backendModelFactory = $backendModelFactory;
  64. $this->metadataProvider = $metadataProvider;
  65. $this->storeManager = $storeManager;
  66. $this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
  67. }
  68. /**
  69. * Save file to temp media directory
  70. *
  71. * @param string $fileId
  72. * @return array
  73. * @throws LocalizedException
  74. */
  75. public function saveToTmp($fileId)
  76. {
  77. try {
  78. $result = $this->save($fileId, $this->getAbsoluteTmpMediaPath());
  79. $result['url'] = $this->getTmpMediaUrl($result['file']);
  80. } catch (\Exception $e) {
  81. $result = ['error' => $e->getMessage(), 'errorcode' => $e->getCode()];
  82. }
  83. return $result;
  84. }
  85. /**
  86. * Retrieve temp media url
  87. *
  88. * @param string $file
  89. * @return string
  90. */
  91. protected function getTmpMediaUrl($file)
  92. {
  93. return $this->storeManager->getStore()->getBaseUrl(UrlInterface::URL_TYPE_MEDIA)
  94. . 'tmp/' . self::FILE_DIR . '/' . $this->prepareFile($file);
  95. }
  96. /**
  97. * Prepare file
  98. *
  99. * @param string $file
  100. * @return string
  101. */
  102. protected function prepareFile($file)
  103. {
  104. return ltrim(str_replace('\\', '/', $file), '/');
  105. }
  106. /**
  107. * Retrieve absolute temp media path
  108. *
  109. * @return string
  110. */
  111. protected function getAbsoluteTmpMediaPath()
  112. {
  113. return $this->mediaDirectory->getAbsolutePath('tmp/' . self::FILE_DIR);
  114. }
  115. /**
  116. * Save image
  117. *
  118. * @param string $fileId
  119. * @param string $destination
  120. * @return array
  121. * @throws LocalizedException
  122. */
  123. protected function save($fileId, $destination)
  124. {
  125. /** @var File $backendModel */
  126. $backendModel = $this->getBackendModel($fileId);
  127. $uploader = $this->uploaderFactory->create(['fileId' => $fileId]);
  128. $uploader->setAllowRenameFiles(true);
  129. $uploader->setFilesDispersion(false);
  130. $uploader->setAllowedExtensions($backendModel->getAllowedExtensions());
  131. $uploader->addValidateCallback('size', $backendModel, 'validateMaxSize');
  132. $result = $uploader->save($destination);
  133. unset($result['path']);
  134. return $result;
  135. }
  136. /**
  137. * Retrieve backend model by field code
  138. *
  139. * @param string $code
  140. * @return File
  141. * @throws LocalizedException
  142. */
  143. protected function getBackendModel($code)
  144. {
  145. $metadata = $this->metadataProvider->get();
  146. if (!(isset($metadata[$code]) && isset($metadata[$code]['backend_model']))) {
  147. throw new LocalizedException(__('The backend model isn\'t specified for "%1".', $code));
  148. }
  149. return $this->backendModelFactory->createByPath($metadata[$code]['path']);
  150. }
  151. }