Upload.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Customer\Controller\Adminhtml\File\Address;
  7. use Magento\Backend\App\Action;
  8. use Magento\Backend\App\Action\Context;
  9. use Magento\Customer\Api\AddressMetadataInterface;
  10. use Magento\Customer\Model\FileUploader;
  11. use Magento\Customer\Model\FileUploaderFactory;
  12. use Magento\Framework\App\Action\HttpGetActionInterface;
  13. use Magento\Framework\App\Action\HttpPostActionInterface;
  14. use Magento\Framework\Controller\ResultFactory;
  15. use Magento\Framework\Exception\LocalizedException;
  16. use Psr\Log\LoggerInterface;
  17. /**
  18. * Uploads files for customer address
  19. */
  20. class Upload extends Action implements HttpGetActionInterface, HttpPostActionInterface
  21. {
  22. /**
  23. * Authorization level of a basic admin session
  24. *
  25. * @see _isAllowed()
  26. */
  27. const ADMIN_RESOURCE = 'Magento_Customer::manage';
  28. /**
  29. * @var FileUploaderFactory
  30. */
  31. private $fileUploaderFactory;
  32. /**
  33. * @var AddressMetadataInterface
  34. */
  35. private $addressMetadataService;
  36. /**
  37. * @var LoggerInterface
  38. */
  39. private $logger;
  40. /**
  41. * @var string
  42. */
  43. private $scope;
  44. /**
  45. * @param Context $context
  46. * @param FileUploaderFactory $fileUploaderFactory
  47. * @param AddressMetadataInterface $addressMetadataService
  48. * @param LoggerInterface $logger
  49. * @param string $scope
  50. */
  51. public function __construct(
  52. Context $context,
  53. FileUploaderFactory $fileUploaderFactory,
  54. AddressMetadataInterface $addressMetadataService,
  55. LoggerInterface $logger,
  56. string $scope = 'address'
  57. ) {
  58. $this->fileUploaderFactory = $fileUploaderFactory;
  59. $this->addressMetadataService = $addressMetadataService;
  60. $this->logger = $logger;
  61. $this->scope = $scope;
  62. parent::__construct($context);
  63. }
  64. /**
  65. * @inheritDoc
  66. */
  67. public function execute()
  68. {
  69. try {
  70. if (empty($_FILES)) {
  71. throw new \Exception('$_FILES array is empty.');
  72. }
  73. // Must be executed before any operations with $_FILES!
  74. $this->convertFilesArray();
  75. $attributeCode = key($_FILES[$this->scope]['name']);
  76. $attributeMetadata = $this->addressMetadataService->getAttributeMetadata($attributeCode);
  77. /** @var FileUploader $fileUploader */
  78. $fileUploader = $this->fileUploaderFactory->create([
  79. 'attributeMetadata' => $attributeMetadata,
  80. 'entityTypeCode' => AddressMetadataInterface::ENTITY_TYPE_ADDRESS,
  81. 'scope' => $this->scope,
  82. ]);
  83. $errors = $fileUploader->validate();
  84. if (true !== $errors) {
  85. $errorMessage = implode('</br>', $errors);
  86. throw new LocalizedException(__($errorMessage));
  87. }
  88. $result = $fileUploader->upload();
  89. } catch (LocalizedException $e) {
  90. $result = [
  91. 'error' => $e->getMessage(),
  92. 'errorcode' => $e->getCode(),
  93. ];
  94. } catch (\Exception $e) {
  95. $this->logger->critical($e);
  96. $result = [
  97. 'error' => __('Something went wrong while saving file.'),
  98. 'errorcode' => $e->getCode(),
  99. ];
  100. }
  101. /** @var \Magento\Framework\Controller\Result\Json $resultJson */
  102. $resultJson = $this->resultFactory->create(ResultFactory::TYPE_JSON);
  103. $resultJson->setData($result);
  104. return $resultJson;
  105. }
  106. /**
  107. * Update global $_FILES array. Convert data to standard form
  108. *
  109. * NOTE: This conversion is required to use \Magento\Framework\File\Uploader::_setUploadFileId($fileId) method.
  110. *
  111. * @return void
  112. */
  113. private function convertFilesArray()
  114. {
  115. foreach ($_FILES as $itemKey => $item) {
  116. foreach ($item as $fieldName => $value) {
  117. $_FILES[$this->scope][$fieldName] = [$itemKey => $value];
  118. }
  119. unset($_FILES[$itemKey]);
  120. }
  121. }
  122. }