urlBuilder = $urlBuilder; } /** * Save uploaded file and remote temporary file before saving config value * * @return $this * @throws LocalizedException */ public function beforeSave() { $values = $this->getValue(); $value = reset($values) ?: []; if (!isset($value['file'])) { throw new LocalizedException( __('%1 does not contain field \'file\'', $this->getData('field_config/field')) ); } if (isset($value['exists'])) { $this->setValue($value['file']); return $this; } $filename = basename($value['file']); $result = $this->_mediaDirectory->copyFile( $this->getTmpMediaPath($filename), $this->_getUploadDir() . '/' . $filename ); if ($result) { $this->_mediaDirectory->delete($this->getTmpMediaPath($filename)); if ($this->_addWhetherScopeInfo()) { $filename = $this->_prependScopeInfo($filename); } $this->setValue($filename); } else { $this->unsValue(); } return $this; } /** * @return array */ public function afterLoad() { $value = $this->getValue(); if ($value && !is_array($value)) { $fileName = $this->_getUploadDir() . '/' . basename($value); $fileInfo = null; if ($this->_mediaDirectory->isExist($fileName)) { $stat = $this->_mediaDirectory->stat($fileName); $url = $this->getStoreMediaUrl($value); $fileInfo = [ [ 'url' => $url, 'file' => $value, 'size' => is_array($stat) ? $stat['size'] : 0, 'name' => basename($value), 'type' => $this->getMimeType($fileName), 'exists' => true, ] ]; } $this->setValue($fileInfo); } return $this; } /** * Getter for allowed extensions of uploaded files * * @return array */ public function getAllowedExtensions() { return []; } /** * Retrieve upload directory path * * @param string $uploadDir * @return string */ protected function getUploadDirPath($uploadDir) { return $this->_mediaDirectory->getRelativePath($uploadDir); } /** * @return array */ public function getValue() { return $this->getData('value') ?: []; } /** * Retrieve store media url * * @param string $fileName * @return mixed */ protected function getStoreMediaUrl($fileName) { $fieldConfig = $this->getFieldConfig(); $baseUrl = ''; $urlType = ['_type' => UrlInterface::URL_TYPE_MEDIA]; if (isset($fieldConfig['base_url'])) { $baseUrl = $fieldConfig['base_url']; $urlType = ['_type' => empty($baseUrl['type']) ? 'link' : (string)$baseUrl['type']]; $baseUrl = $baseUrl['value'] . '/'; } return $this->urlBuilder->getBaseUrl($urlType) . $baseUrl . $fileName; } /** * Retrieve temp media path * * @param string $filename * @return string */ protected function getTmpMediaPath($filename) { return 'tmp/' . FileProcessor::FILE_DIR . '/' . $filename; } /** * Retrieve MIME type of requested file * * @param string $fileName * @return string */ private function getMimeType($fileName) { $absoluteFilePath = $this->_mediaDirectory->getAbsolutePath($fileName); $result = $this->getMime()->getMimeType($absoluteFilePath); return $result; } /** * Get Mime instance * * @return Mime * * @deprecated 100.2.0 */ private function getMime() { if ($this->mime === null) { $this->mime = ObjectManager::getInstance()->get(Mime::class); } return $this->mime; } }