src/AtechNet/CoreBundle/Entity/AbstractFile.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\AtechNet\CoreBundle\Entity;
  3. use Doctrine\ORM\Mapping\Column;
  4. use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
  5. use Doctrine\ORM\Mapping\MappedSuperclass;
  6. use Doctrine\ORM\Mapping\PostPersist;
  7. use Doctrine\ORM\Mapping\PostRemove;
  8. use Doctrine\ORM\Mapping\PostUpdate;
  9. use Doctrine\ORM\Mapping\PrePersist;
  10. use Doctrine\ORM\Mapping\PreRemove;
  11. use Doctrine\ORM\Mapping\PreUpdate;
  12. use Symfony\Component\HttpFoundation\File\UploadedFile;
  13. use Symfony\Component\Validator\Constraints as Assert;
  14. /**
  15.  * Class AbstractType
  16.  *
  17.  * @MappedSuperclass
  18.  * @HasLifecycleCallbacks
  19.  */
  20. abstract class AbstractFile extends AbstractSortableEntity
  21. {
  22.     /**
  23.      * @Column(name="salt", type="text")
  24.      */
  25.     protected $salt;
  26.     /**
  27.      * @Column(name="mime_type", type="text")
  28.      */
  29.     protected $mimeType;
  30.     /**
  31.      * @Column(name="original_name", type="text")
  32.      */
  33.     private $originalName;
  34.     /**
  35.      * @var UploadedFile
  36.      *
  37.      * @Assert\File(maxSize="6000000")
  38.      */
  39.     private $file;
  40.     public function __construct()
  41.     {
  42.         parent::__construct();
  43.         $this->salt = md5(uniqid(null, true));
  44.     }
  45.     /**
  46.      * @return mixed
  47.      */
  48.     public function getOriginalName()
  49.     {
  50.         return $this->originalName;
  51.     }
  52.     /**
  53.      * @param mixed $originalName
  54.      */
  55.     public function setOriginalName($originalName)
  56.     {
  57.         $this->originalName = $originalName;
  58.     }
  59.     /**
  60.      * @return mixed
  61.      */
  62.     public function getMimeType()
  63.     {
  64.         return $this->mimeType;
  65.     }
  66.     /**
  67.      * @param mixed $mimeType
  68.      */
  69.     public function setMimeType($mimeType)
  70.     {
  71.         $this->mimeType = $mimeType;
  72.     }
  73.     /**
  74.      * Sets file.
  75.      */
  76.     public function setFile($file)
  77.     {
  78.         $this->file = $file;
  79.     }
  80.     /**
  81.      * Get file.
  82.      *
  83.      * @return UploadedFile
  84.      */
  85.     public function getFile()
  86.     {
  87.         return $this->file;
  88.     }
  89.     /**
  90.      * @PrePersist()
  91.      * @PreUpdate()
  92.      */
  93.     final public function preUpload()
  94.     {
  95.         if (!is_null($this->file)) {
  96.             $this->mimeType = $this->file->getMimeType();
  97.             $this->originalName = htmlspecialchars($this->file->getClientOriginalName());
  98.         }
  99.     }
  100.     public function guessExtension()
  101.     {
  102.         return $this->mime2extension($this->mimeType);
  103.     }
  104.     /**
  105.      * @PostPersist()
  106.      * @PostUpdate()
  107.      */
  108.     final public function upload()
  109.     {
  110.         if (!is_null($this->file)) {
  111.             $this->getFile()->move($this->getUploadRootDir(), $this->getFileName());
  112.             $this->file = null;
  113.             $this->postUploadProcess();
  114.         }
  115.     }
  116.     private function mime2extension($mime)
  117.     {
  118.         $all_mimes = '{"png":["image\/png","image\/x-png"],"bmp":["image\/bmp","image\/x-bmp","image\/x-bitmap","image\/x-xbitmap","image\/x-win-bitmap","image\/x-windows-bmp","image\/ms-bmp","image\/x-ms-bmp","application\/bmp","application\/x-bmp","application\/x-win-bitmap"],"gif":["image\/gif"],"jpeg":["image\/jpeg","image\/pjpeg"],"xspf":["application\/xspf+xml"],"vlc":["application\/videolan"],"wmv":["video\/x-ms-wmv","video\/x-ms-asf"],"au":["audio\/x-au"],"ac3":["audio\/ac3"],"flac":["audio\/x-flac"],"ogg":["audio\/ogg","video\/ogg","application\/ogg"],"kmz":["application\/vnd.google-earth.kmz"],"kml":["application\/vnd.google-earth.kml+xml"],"rtx":["text\/richtext"],"rtf":["text\/rtf"],"jar":["application\/java-archive","application\/x-java-application","application\/x-jar"],"zip":["application\/x-zip","application\/zip","application\/x-zip-compressed","application\/s-compressed","multipart\/x-zip"],"7zip":["application\/x-compressed"],"xml":["application\/xml","text\/xml"],"svg":["image\/svg+xml"],"3g2":["video\/3gpp2"],"3gp":["video\/3gp","video\/3gpp"],"mp4":["video\/mp4"],"m4a":["audio\/x-m4a"],"f4v":["video\/x-f4v"],"flv":["video\/x-flv"],"webm":["video\/webm"],"aac":["audio\/x-acc"],"m4u":["application\/vnd.mpegurl"],"pdf":["application\/pdf","application\/octet-stream"],"pptx":["application\/vnd.openxmlformats-officedocument.presentationml.presentation"],"ppt":["application\/powerpoint","application\/vnd.ms-powerpoint","application\/vnd.ms-office","application\/msword"],"docx":["application\/vnd.openxmlformats-officedocument.wordprocessingml.document"],"xlsx":["application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application\/vnd.ms-excel"],"xl":["application\/excel"],"xls":["application\/msexcel","application\/x-msexcel","application\/x-ms-excel","application\/x-excel","application\/x-dos_ms_excel","application\/xls","application\/x-xls"],"xsl":["text\/xsl"],"mpeg":["video\/mpeg"],"mov":["video\/quicktime"],"avi":["video\/x-msvideo","video\/msvideo","video\/avi","application\/x-troff-msvideo"],"movie":["video\/x-sgi-movie"],"log":["text\/x-log"],"txt":["text\/plain"],"css":["text\/css"],"html":["text\/html"],"wav":["audio\/x-wav","audio\/wave","audio\/wav"],"xhtml":["application\/xhtml+xml"],"tar":["application\/x-tar"],"tgz":["application\/x-gzip-compressed"],"psd":["application\/x-photoshop","image\/vnd.adobe.photoshop"],"exe":["application\/x-msdownload"],"js":["application\/x-javascript"],"mp3":["audio\/mpeg","audio\/mpg","audio\/mpeg3","audio\/mp3"],"rar":["application\/x-rar","application\/rar","application\/x-rar-compressed"],"gzip":["application\/x-gzip"],"hqx":["application\/mac-binhex40","application\/mac-binhex","application\/x-binhex40","application\/x-mac-binhex40"],"cpt":["application\/mac-compactpro"],"bin":["application\/macbinary","application\/mac-binary","application\/x-binary","application\/x-macbinary"],"oda":["application\/oda"],"ai":["application\/postscript"],"smil":["application\/smil"],"mif":["application\/vnd.mif"],"wbxml":["application\/wbxml"],"wmlc":["application\/wmlc"],"dcr":["application\/x-director"],"dvi":["application\/x-dvi"],"gtar":["application\/x-gtar"],"php":["application\/x-httpd-php","application\/php","application\/x-php","text\/php","text\/x-php","application\/x-httpd-php-source"],"swf":["application\/x-shockwave-flash"],"sit":["application\/x-stuffit"],"z":["application\/x-compress"],"mid":["audio\/midi"],"aif":["audio\/x-aiff","audio\/aiff"],"ram":["audio\/x-pn-realaudio"],"rpm":["audio\/x-pn-realaudio-plugin"],"ra":["audio\/x-realaudio"],"rv":["video\/vnd.rn-realvideo"],"jp2":["image\/jp2","video\/mj2","image\/jpx","image\/jpm"],"tiff":["image\/tiff"],"eml":["message\/rfc822"],"pem":["application\/x-x509-user-cert","application\/x-pem-file"],"p10":["application\/x-pkcs10","application\/pkcs10"],"p12":["application\/x-pkcs12"],"p7a":["application\/x-pkcs7-signature"],"p7c":["application\/pkcs7-mime","application\/x-pkcs7-mime"],"p7r":["application\/x-pkcs7-certreqresp"],"p7s":["application\/pkcs7-signature"],"crt":["application\/x-x509-ca-cert","application\/pkix-cert"],"crl":["application\/pkix-crl","application\/pkcs-crl"],"pgp":["application\/pgp"],"gpg":["application\/gpg-keys"],"rsa":["application\/x-pkcs7"],"ics":["text\/calendar"],"zsh":["text\/x-scriptzsh"],"cdr":["application\/cdr","application\/coreldraw","application\/x-cdr","application\/x-coreldraw","image\/cdr","image\/x-cdr","zz-application\/zz-winassoc-cdr"],"wma":["audio\/x-ms-wma"],"vcf":["text\/x-vcard"],"srt":["text\/srt"],"vtt":["text\/vtt"],"ico":["image\/x-icon","image\/x-ico","image\/vnd.microsoft.icon"],"csv":["text\/x-comma-separated-values","text\/comma-separated-values","application\/vnd.msexcel"],"json":["application\/json","text\/json"]}';
  119.         $all_mimes = json_decode($all_mimes, true);
  120.         foreach ($all_mimes as $key => $value) {
  121.             if (in_array($mime, $value)) {
  122.                 return $key;
  123.             }
  124.         }
  125.         return false;
  126.     }
  127.     protected function postUploadProcess()
  128.     {
  129.     }
  130.     private $oldId;
  131.     /**
  132.      * @PreRemove()
  133.      */
  134.     public function bakOldId()
  135.     {
  136.         $this->oldId = $this->getId();
  137.     }
  138.     /**
  139.      * @PostRemove()
  140.      */
  141.     public function deleteFile()
  142.     {
  143.         $file = $this->getAbsolutePath();
  144.         if ($file !== null && file_exists($file)) {
  145.             unlink($file);
  146.         }
  147.     }
  148.     protected function getFileName()
  149.     {
  150.         return $this->buildFileName('');
  151.     }
  152.     protected function buildFileName($fix)
  153.     {
  154.         if ($fix !== '') {
  155.             $fix = '_' . $fix;
  156.         }
  157.         return ($this->getId() !== null ? $this->getId() : $this->oldId) . $this->salt . $fix . '.' . $this->guessExtension();
  158.     }
  159.     public function buildFn($fix)
  160.     {
  161.         if ($fix !== '') {
  162.             $fix = '_' . $fix;
  163.         }
  164.         return ($this->getId() !== null ? $this->getId() : $this->oldId) . $this->salt . $fix . '.' . $this->guessExtension();
  165.     }
  166.     public function getAbsolutePath()
  167.     {
  168.         return $this->buildAbsolutePath('');
  169.     }
  170.     public function buildAbsolutePath($fix)
  171.     {
  172.         return $this->getUploadRootDir() . '/' . $this->buildFileName($fix);
  173.     }
  174.     protected function getUploadRootDir()
  175.     {
  176.         return __DIR__ . '/../../../../web/' . $this->getUploadDir();
  177.     }
  178.     public function getWebPath()
  179.     {
  180.         return $this->getUploadDir() . '/' . $this->getFileName();
  181.     }
  182.     abstract protected function getUploadDir();
  183.     public function isFileExist()
  184.     {
  185.         return file_exists($this->getAbsolutePath());
  186.     }
  187.     /**
  188.      * @return mixed
  189.      */
  190.     public function getSalt()
  191.     {
  192.         return $this->salt;
  193.     }
  194. }