Skip to content
Snippets Groups Projects
Commit f5664ec9 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Filtre par types mime et par extensions pour les PJ

parent 94ecf6d4
No related branches found
No related tags found
1 merge request!55Ll bug report services
......@@ -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);
......
......@@ -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');
......
......@@ -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;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment