customerMetadataService = $customerMetadataService; $this->addressMetadataService = $addressMetadataService; $this->elementFactory = $elementFactory; $this->fileProcessorFactory = $fileProcessorFactory; $this->attributeMetadata = $attributeMetadata; $this->entityTypeCode = $entityTypeCode; $this->scope = $scope; } /** * Validate uploaded file * * @return array|bool */ public function validate() { $formElement = $this->elementFactory->create( $this->attributeMetadata, null, $this->entityTypeCode ); $errors = $formElement->validateValue($this->getData()); return $errors; } /** * Execute file uploading * * @return \string[] * @throws LocalizedException */ public function upload() { return $this->uploadFile(); } /** * File uploading process * * @param bool $useScope * @return string[] * @throws LocalizedException */ public function uploadFile($useScope = true) { /** @var FileProcessor $fileProcessor */ $fileProcessor = $this->fileProcessorFactory->create( [ 'entityTypeCode' => $this->entityTypeCode, 'allowedExtensions' => $this->getAllowedExtensions(), ] ); if ($useScope === true) { $fileId = $this->scope . '[' . $this->getAttributeCode() . ']'; } else { $fileId = $this->getAttributeCode(); } $result = $fileProcessor->saveTemporaryFile($fileId); // Update tmp_name param. Required for attribute validation! $result['tmp_name'] = ltrim($result['file'] ?? '', '/'); $result['url'] = $fileProcessor->getViewUrl( FileProcessor::TMP_DIR . '/' . ltrim($result['name'] ?? '', '/'), $this->attributeMetadata->getFrontendInput() ); return $result; } /** * Get attribute code * * @return string */ private function getAttributeCode() { // phpcs:disable Magento2.Security.Superglobal if (is_array($_FILES[$this->scope]['name'])) { $code = key($_FILES[$this->scope]['name']); } else { $code = $this->scope; } // phpcs:enable Magento2.Security.Superglobal return $code; } /** * Retrieve data from global $_FILES array * * @return array */ private function getData() { $data = []; // phpcs:disable Magento2.Security.Superglobal $fileAttributes = $_FILES[$this->scope]; foreach ($fileAttributes as $attributeName => $attributeValue) { if (is_array($attributeValue)) { $data[$attributeName] = $attributeValue[$this->getAttributeCode()]; } else { $data[$attributeName] = $attributeValue; } } // phpcs:enable Magento2.Security.Superglobal return $data; } /** * Get allowed extensions * * @return array */ private function getAllowedExtensions() { $allowedExtensions = []; $validationRules = $this->attributeMetadata->getValidationRules(); foreach ($validationRules as $validationRule) { if ($validationRule->getName() == 'file_extensions') { $allowedExtensions = explode(',', $validationRule->getValue() ?? ''); array_walk( $allowedExtensions, function (&$value) { $value = strtolower(trim($value)); } ); break; } } return $allowedExtensions; } }