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

Filtre par types mime et par extensions pour les PJ


(cherry picked from commit f5664ec9)
parent ddf64a43
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -257,7 +257,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;
    }