Всем прекрасного времени суток! Создаю небольшой 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;
}
}
}
Если есть какие то уже придуманные подходы обработки данных в симфони (наверняка они уже есть) подскажите где езмь, и если возможно, подскажите пожалуйсто имеет ли право существование такого подхода, если нет то почему (что б знать почему так не стоит делать)?