/** * @param UploadedFile|null $uploadedFile * @param array $options * @return AssetFile */ public function handleUpload(UploadedFile $uploadedFile = null, array $options = []) { $resolver = new OptionsResolver(); $resolver->setDefaults(['type' => null, 'fallbackType' => null, 'targetUri' => null])->setAllowedTypes(['type' => ['string', 'null'], 'fallbackType' => ['int', 'null'], 'targetUri' => ['string', 'null']])->setAllowedValues(['type' => ['image', 'audio', 'file', null]]); $options = $resolver->resolve($options); if (!$uploadedFile instanceof UploadedFile || !$uploadedFile->isValid() || !($assetFile = new AssetFile($uploadedFile, null, $options['fallbackType'])) || $assetFile->getType() === null) { throw new \RuntimeException('Invalid uploaded file'); } $assetFile->setOriginalName($uploadedFile->getClientOriginalName()); if ($options['type'] !== null) { $this->validateAssetFileType($assetFile, $options['type']); } if ($options['targetUri'] !== null) { $uploadsDir = $this->assetsResolver->uriToPath($options['targetUri']); } else { $uploadsDir = $this->assetsResolver->assetPath($assetFile->getType()); } $tempFile = $uploadedFile->move($uploadsDir, $this->getTargetFileName($uploadedFile->getClientOriginalName(), $uploadsDir)); $assetFile->setFile($tempFile); $uri = $this->assetsResolver->pathToUri($assetFile->getFile()->getPathname()); if ($uri === null) { throw new \RuntimeException('Unable to retrieve uploaded file uri'); } $assetFile->setUri($uri); return $assetFile; }
/** * @param string $imageName * @return ImagePreview */ private function extractPreviewData($imageName) { // example: name_500x300.png $regexp = '/(?<name>[^\\/]*?)(_(?<width>\\d+)x(?<height>\\d+))?(\\.(?<extension>[0-9a-z]+))$/i'; preg_match($regexp, $imageName, $imageNameParts); $requiredKeys = ['name', 'width', 'height', 'extension']; foreach ($requiredKeys as $key) { if (!isset($imageNameParts[$key])) { throw new \InvalidArgumentException(sprintf("Info about '%' can't be extracted from image name '%s'", $key, $imageName)); } } $sourcePath = $this->assetsResolver->assetUri(AssetFile::TYPE_IMAGE) . '/' . $imageNameParts['name'] . '.' . $imageNameParts['extension']; $imagePreviewData = new ImagePreview(); $imagePreviewData->setSourceUri($sourcePath)->setTargetName($imageName)->setWidth($imageNameParts['width'])->setHeight($imageNameParts['height']); return $imagePreviewData; }