symfony Извлечение файла из data: URL в base64 (data:image/jpeg;base64)
Primary tabs
Почему-то DataUriNormalizer совершенно не помогает при загрузке из строки вроде (строка приведена целиком - это небольшое изображение jpeg):
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAyADIDAREAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAAAAEGBwQFCAID/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHqbIAB0CgADV1CalxvYUMryqirGOpD7Cisyma35aRM4zYxK5rqckzJpCgHXqo7G9j0AAOlAAAf/8QAHhAAAgMAAgMBAAAAAAAAAAAAAwQCBQYBEAAUMCD/2gAIAQEAAQUC+VjYirV+NkuA1dAkmO9BrFa5J+xDfU2cWbeOCUZD60GilGtq2EDKiSGBlTOGYSUW9QPjLHII7ZRlQ9Ln6mtpcujAKH5YpQslhDgcfl//xAAUEQEAAAAAAAAAAAAAAAAAAABQ/9oACAEDAQE/AUf/xAAUEQEAAAAAAAAAAAAAAAAAAABQ/9oACAECAQE/AUf/xAAxEAACAQIDBAgFBQAAAAAAAAABAgMEEQASIRMiMYEFEBRBQlFxkSAwMmGxIzNyofH/2gAIAQEABj8C+U0sh4C+XE20lE6llyCPQx30yt+efpirmkN8zZF9F/34KoQVERq4xormw98RmqaqKQzCOuV77WIH6BkHG+mv288UzVlO/R1FCpR4AZAankTujX+z54GUZQPDa1uuslo5uyrRuRNUSrpp4R6nTFDUQ5qivedtopVTK0g1F7t+3lPvxwazsscnSTrsYoabMfQC/kLXbQWHvT9umMM0e8i0zHcvxUk3zYCZ2kPe7cT1XETyfxF8S1cUdTPAXLk7DSIkAOuv1KwPvzxE8FzUFCmdlIcg8RblywtUx2tXMP1JD9vCvcF8rfFmeSXZls5hzbt/yORwFUBVAsAO75f/xAAgEAEBAQACAgIDAQAAAAAAAAABESEAMSBBUWEQcYHR/9oACAEBAAE/IfCeVcXUOp8/r764KpyItnYlJq34exPIZGaafVX+vhuCxbtiZl7/ALyvYsKeAQNrLJNclc9Og9ZOVvaStHK/kCvR6nLyc7pVh1ycVe9M36tx3CNVUQUdZQrETq7h0mXtuMb0DxQQ0E+aEHLgZnD9qctfnM/AatZ6n875i8+hQxQ4xw6POwyOY6uJH9kfs4+iDMhSY4Wxj3tvk/RlEv5jJLFAFOtaF8wcAdAePry//9oADAMBAAIAAwAAABDbYDbYADLCCBASbAQbAJbbDbbf/8QAFBEBAAAAAAAAAAAAAAAAAAAAUP/aAAgBAwEBPxBH/8QAGREAAgMBAAAAAAAAAAAAAAAAEBEBIDBB/9oACAECAQE/EMkUVkxGLty3/8QAHRABAQACAgMBAAAAAAAAAAAAAREAITFBECBRYf/aAAgBAQABPxD0E4kfUFwSWFq7cAGrTtDeGsgjRN2koUphEYpnbsJiU7dHkehyPgLknBYqYqAEcwgfmX3eG9CQdGkot3RCMC0RipUBwE5U2OaEfAgnGvmsnBOVvAWyGhQTZKjTiMKTvKOGgynjAFdeFhYcSsCpMLUn9DCj5g4qjRV3JzqRBQQaAgddu/A+IE8y8oahvRP0z4ehwa6jnF8SsWiyEW6QDBsEaFBElqgiBuQDS01vkY4NMiLxaBvQAumFOIPKnTUA0AAAcevb2//Z
В итоге в rusphp добавили класс Base64TempFile для создания временных файлов из base64 (для промежуточного хранения автоматически использует стандартную директорию для временных файлов):
use ItForFree\rusphp\File\Base64\Base64TempFile; use ItForFree\rusphp\File\Path; if (!empty($data['photo'])) { // если пришла строка $base64TmpFile = new Base64TempFile($data['photo']); $imageFile = new UploadedFile( $base64TmpFile->getPath(), 'avatar.' . $base64TmpFile->getExtention(), $base64TmpFile->getMime(), null, true );
-- получаем UploadedFile, а дальше работаем с ним как и на обычной форме, например:
$imageFile = new UploadedFile($base64TmpFile->getPath(), 'avatar.' . $base64TmpFile->getExtention(), $base64TmpFile->getMime(), null, true ); if ($imageFile) { $originalFilename = pathinfo($imageFile->getClientOriginalName(), PATHINFO_FILENAME); // чтобы безопасно использовать имя файла как часть URL преобразуем его $safeFilename = transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()', $originalFilename); $newFilename = $safeFilename . '-' . uniqid() . '.' . $imageFile->guessExtension(); // перемещаем файл в нужную директорию $currentDatePath = (new \DateTime('now'))->format('Y/m/d'); $folderPath = Path::concat([$this->params->get('user_avatar_directory_abs'), $currentDatePath]); try { $imageFile->move( $folderPath, $newFilename ); } catch (FileException $e) { // обрабатываем исключение на случай если что-то пошло не так } if (empty($context['object_to_populate'])) { $context['object_to_populate'] = new $class(); } $context['object_to_populate']->setPhotoPath( Path::concat([$currentDatePath, $newFilename]) ); }
- Log in to post comments
- 1479 reads