Commit f5664ec9 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Filtre par types mime et par extensions pour les PJ

parent 94ecf6d4
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -258,7 +258,10 @@ class PieceJointeController extends AbstractController
            return $result;
        }
        if (is_array($result)) {
            $pj = $this->getServicePieceJointe()->ajouterFichiers($result['files'], $intervenant, $typePieceJointe);
            $errors = $this->getServicePieceJointe()->ajouterFichiers($result['files'], $intervenant, $typePieceJointe);
            if (!empty($errors)) {
                return new JsonModel(['errors' => $errors]);
            }
        }

        $this->updateTableauxBord($intervenant);
+70 −2
Original line number Diff line number Diff line
@@ -81,6 +81,74 @@ class FichierService extends AbstractEntityService



    public function isValide(Fichier $fichier): bool
    {
        $exts = [
            'pdf', 'jpg', 'jpeg', 'png', 'bmp', 'gif', 'tif', 'tiff', 'rtf', 'txt', 'csv', 'html', 'htm', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odg', 'odp',
        ];
        $ext  = strtolower($fichier->getNom());
        $ext  = substr($ext, strrpos($ext, '.') + 1);

        if (in_array($ext, $exts)) return true;


        $patterns = [
            // PDF
            '#application/pdf$#i',
            '#^image/pdf$#i',
            '#^application/rugpdf$#i',
            '#^application/x-unknown-application-pdf$#i',
            '#^application/x-pdf$#i',
            '#^document/pdf$#i',
            '#^pdf/pdf$#i',
            '#^text/pdf$#i',
            '#^pdf/application$#i',

            // Images
            '#^image/jpeg$#i',
            '#^image/png$#i',
            '#^application/png$#i',
            '#^image/tiff$#i',
            '#^image/gif$#i',
            '#^image/bmp$#i',
            '#^image/pjpeg$#i',
            '#^image/heic$#i',

            // Bureautique
            '#^application/msword$#i',
            '#^application/vnd.openxmlformats-officedocument#i',
            '#^application/vnd.oasis.opendocument.#i',
            '#^application/xls$#i',
            '#^application/x-msword$#i',
            '#^application/doc$#i',
            '#^application/vnd.ms-xpsdocument#i',
            '#^application/vnd.ms-word#i',
            '#^application/vnd.ms-powerpoint#i',
            '#^application/vnd.ms-excel#i',
            '#^text/rtf$#i',
            '#^application/docx$#i',
            '#^application/rtf$#i',

            // Texte
            '#^text/plain$#i',
            '#^application/csv$#i',
            '#^text/html$#i',
            '#^text/richtext$#i',

        ];

        $mime = str_replace('"', '', $fichier->getTypeMime());
        $mime = str_replace("'", '', $mime);
        $mime = str_replace("%22", '', $mime);
        foreach ($patterns as $pattern) {
            if (preg_match($pattern, $mime)) return true;
        }

        return false;
    }



    public function getConfigStockage(): string
    {
        $conf     = \AppConfig::get('fichiers');
+10 −6
Original line number Diff line number Diff line
@@ -280,9 +280,9 @@ class PieceJointeService extends AbstractEntityService
     *                             321215]
     * @param boolean $deleteFiles Supprimer les fichiers après création de la PJ$
     *
     * @return PieceJointe[]
     * @return array
     */
    public function ajouterFichiers($files, Intervenant $intervenant, TypePieceJointe $type, $deleteFiles = true)
    public function ajouterFichiers($files, Intervenant $intervenant, TypePieceJointe $type, $deleteFiles = true): array
    {
        if (!$files) {
            throw new \LogicException("Aucune donnée sur les fichiers spécifiée.");
@@ -300,6 +300,7 @@ class PieceJointeService extends AbstractEntityService
            $this->getEntityManager()->persist($pj);
        }

        $errors = [];
        foreach ($files as $file) {
            $path          = $file['tmp_name'];
            $nomFichier    = str_replace([',', ';', ':'], '', $file['name']);
@@ -313,10 +314,13 @@ class PieceJointeService extends AbstractEntityService
                ->setContenu(file_get_contents($path))
                ->setValidation(null);

            $pj->addFichier($fichier);

            if ($this->getServiceFichier()->isValide($fichier)) {
                $pj->addFichier($fichier);
                $this->getServiceFichier()->save($fichier);

            } else {
                $errors[] = 'Fichier ' . $fichier->getNom() . ' invalide : format "' . $fichier->getTypeMime() . '" non reconnu ou interdit.';
            }

            if ($deleteFiles) {
                unlink($path);
@@ -325,7 +329,7 @@ class PieceJointeService extends AbstractEntityService

        $this->getEntityManager()->flush();

        return $pj;
        return $errors;
    }