UploadSubscriber::getSubscribedEvents()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
c 2
b 1
f 0
dl 0
loc 6
rs 9.4285
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: Rafidion Michael
5
 * Date: 30/11/2014
6
 * Time: 18:22
7
 */
8
9
namespace Mykees\MediaBundle\EventListener;
10
11
12
use Doctrine\Common\Persistence\ManagerRegistry;
13
use Mykees\MediaBundle\Helper\ResizeHelper;
14
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15
use Mykees\MediaBundle\Event\MediaUploadEvents;
16
use Mykees\MediaBundle\Event\UploadEvent;
17
use Mykees\MediaBundle\Entity\Media;
18
use Mykees\MediaBundle\Util\Urlizer;
19
use Symfony\Component\HttpFoundation\Response;
20
21
class UploadSubscriber implements EventSubscriberInterface {
22
23
    public $em;
24
25
    public function __construct(ManagerRegistry $managerRegistry)
26
    {
27
        $this->em = $managerRegistry->getManager();
28
    }
29
30
31
    public static function getSubscribedEvents()
32
    {
33
        return [
34
            MediaUploadEvents::UPLOAD_FILE => 'uploadProcess'
35
        ];
36
    }
37
38
39
    public function uploadProcess( UploadEvent $event )
40
    {
41
        $file  = $event->getFile()->all();
42
        $fileUploaded = $file['file'];
43
        $model   = $event->getMediableModel();
44
        $model_id = $event->getMediableId();
45
        $resize_option = $event->getContainer()->getParameter('mykees.media.resize');
46
        $extension = pathinfo($fileUploaded->getClientOriginalName(), PATHINFO_EXTENSION);
47
        $DS = DIRECTORY_SEPARATOR;
48
49
50
        if( $this->isValidExtension($extension,$event) )
51
        {
52
            //create dir
53
            $webroot = $event->getRootDir().'/../web';
54
            $dir = $webroot.'/img';
55
56
            if(!file_exists($dir)){mkdir($dir,0777);}
57
58
            $dir .= $DS.date('Y');
59
            if(!file_exists($dir)){mkdir($dir,0777);}
60
61
            $dir .= $DS.date('m');
62
            if(!file_exists($dir)){mkdir($dir,0777);}
63
64
            //clean and define path filename
65
            $filename = $this->cleanFilename( $fileUploaded->getClientOriginalName(), $extension );
66
            //test duplicate
67
            $name = $this->mediaExist( $filename,$webroot );
68
69
            $filePath = date('Y').'/'.date('m').'/'.$name;
70
            $save_media = $this->saveMedia($filePath, $name, $model, $model_id);
71
72
            if($save_media)
73
            {
74
                //upload
75
                $fileUploaded->move($dir,$name);
76
                $event->setMedia($save_media);
77
78
                if(!empty($resize_option[$model]))
79
                {
80
                    $resize = new ResizeHelper($resize_option[$model], $webroot);
81
                    $resize->resize($save_media->getFile());
82
                }
83
84
                return true;
85
            }else{
86
87
                return new Response();
88
            }
89
        }else{
90
91
            return new Response();
92
        }
93
    }
94
95
    /**
96
     * Check if file extension is valid
97
     * @param $extension
98
     * @param $event
99
     * @return bool
100
     */
101
    private function isValidExtension($extension,$event)
102
    {
103
        $extensions = $event->getContainer()->getParameter('mykees.media.extension');
104
        $valid_extensions = !empty($extensions) ? $extensions : ['jpg','jpeg','JPG','JPEG'];
105
106
        return in_array($extension,$valid_extensions);
107
    }
108
109
    /**
110
     * clean the filename
111
     * @param $filename
112
     * @param $extension
113
     * @return string
114
     */
115
    private function cleanFilename( $filename, $extension )
116
    {
117
        $f = explode('.',$filename);
118
        $cleanFilename = Urlizer::urlize(implode('.',array_slice($f,0,-1)));
119
120
        return $cleanFilename.'.'.$extension;
121
    }
122
123
    /**
124
     * Check for double file
125
     * @param $filename
126
     * @param $webroot
127
     * @param int $count
128
     * @return string
129
     */
130
    private function mediaExist( $filename, $webroot, $count=0 )
131
    {
132
        $file = $filename;
133
        $filePath = false;
134
        if($count > 0){
135
            $f = explode('.',$filename);
136
            $file = $f[0].'_'.$count.'.'.end($f);
137
            $filePath = $webroot.'/img/'.date('Y').'/'.date('m').'/'.$file;
138
        }
139
        $filePath = !$filePath ? $webroot.'/img/'.date('Y').'/'.date('m').'/'.$file : $filePath;
140
        if(file_exists($filePath))
141
        {
142
            $count++;
143
144
            return $this->mediaExist( $filename, $webroot, $count );
145
        }else{
146
            $filename =  $file;
147
148
            return $filename;
149
        }
150
    }
151
152
153
    /**
154
     * @param $filePath
155
     * @param $filename
156
     * @param $model
157
     * @param $model_id
158
     * @return Media
159
     */
160
    private function saveMedia($filePath, $filename, $model, $model_id)
161
    {
162
        $media = new Media();
163
        $fn = explode('.',$filename);
164
        $media->setName($fn[0]);
165
        $media->setMediableModel($model);
166
        $media->setMediableId($model_id);
167
        $media->setFile($filePath);
168
169
        $this->em->persist($media);
170
        $this->em->flush();
171
172
        return $media;
173
    }
174
175
176
}
177