AndreyShakhtarin
@AndreyShakhtarin
Один из Землян

Из-за чего в симфони не сохраняются файлы с определенными именами а так же audio файлы?

Всем прекрасного времени суток! Создаю небольшой custom по загрузке файлов разных форматов файлов документы, аудио, картинки и видео. Возникла проблема при загрузке файлов:
1) если в имени файла встречаются "." или "_" файл не записывается в дерикторию.
2) Аудио файлы не загружаются вообще(возможно для медиа файлов другой подход сохранения)
коротко о кастоме:

class ProductController extends Controller
{
...............
метод overrideFiles перенаправляет файлы в свою директорию
1)в массиве хранится имя метода  и сервайс к дериктории где должен хранится файл,
2) передаётся сущность которая будет сохранятся в базу даных
$product = $this->overrideFiles(array(
                'ProductPicture' => 'app.product_picture_uploader',
                'Logo' => 'app.image_logo_uploader',
            ), $product);
...............
}


"пробные кастомы":
public function overrideFiles($data = array('method'  => 'service'), $object, $option = false)
    {

            foreach($data as $method => $service)
            {
                // устонавливаем методы к объекту
                $get = 'get'.$method;
                $set = 'set'.$method;
                // извлекаем объект UploadedFile
                $file = $object->$get();
                условия для редактирования или сохранении нового файла
                if($option){
                    $file = $this->uploadSwitcher($file, $service);
                }else{
                    $file = new File($this->getParameter($service).$file);

                }
                // установка значения файла
                $object->$set($file);
            }
            return $object;
    }


метод обработки и сохранения файлов:
public function uploadSwitcher($fileName, $service = null)
    {
       // проверяем определен ли сервайс и премещаем файл в указаную дерикторию
        if($service !== null){
            $fileName = $this->get("$service")->upload($fileName);
            return $fileName;
        }else{
            //если дериктория не определенна опредиляем тип файла
            $typeFile = $fileName->getClientOriginalExtension();

            $textTypes = array(
                '/doc/'=>'document',
                '/fb2/'=>'document',
                '/readme/'=>'document',
                '/text/'=>'document',
                '/txt/'=>'document',
                '/djv/' =>'document',
                '/docm/' =>'document',
                '/docx/' =>'document',
                '/ibooks/' =>'document',
                '/pdf/' =>'document',
                '/mobi/' =>'document',
                '/flac/' => 'audio',
                '/midi/' => 'audio',
                '/mp3/' => 'audio',
                '/3gp/' => 'video',
                '/3gp2/' => 'video',
                '/avi/' => 'video',
                '/flv/' => 'video',
                '/mkv/' => 'video',
                '/mpg/' => 'video',
                '/mpg2/' => 'video',
                '/wmv/' => 'video',
                '/jpg/' => 'picture',
                '/jpeg/' => 'picture',
                '/png/' => 'picture'

            );
            // сравниваем подходит ли нам тот формат что отправил клиет 
            foreach($textTypes as $textType=>$type)
            {
                if(preg_match($textType, $typeFile))
                {
                    $file = $type;
                }
            }
            //если данный формат нам подходит пререопределяем в дерикторию с таким же типом данных
            switch ($file)
            {
                case 'picture':
                    $fileName = $this->get('app.pictures_product_uploader')->upload($fileName);
                    return $fileName;
                case 'document':
                    echo "wer";
                    $fileName = $this->get('app.documents_product_uploader')->upload($fileName);
                    return $fileName;
                case 'audio':
                    $fileName = $this->get('app.audios_product_uploader')->upload($fileName);
                    return $fileName;
                case 'video':
                    $fileName = $this->get('app.videos_product_uploader')->upload($fileName);
                    return $fileName;
                default: return null;
            }
        }
    }

Если есть какие то уже придуманные подходы обработки данных в симфони (наверняка они уже есть) подскажите где езмь, и если возможно, подскажите пожалуйсто имеет ли право существование такого подхода, если нет то почему (что б знать почему так не стоит делать)?
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
riky
@riky
Laravel
есть спец бандлы загрузчики, например VichUploaderBundle
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы