Spaces:
No application file
No application file
| namespace Mautic\FormBundle\Helper; | |
| use Mautic\CoreBundle\Exception\FileUploadException; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\FileUploader; | |
| use Mautic\FormBundle\Crate\UploadFileCrate; | |
| use Mautic\FormBundle\Entity\Field; | |
| use Mautic\FormBundle\Entity\Form; | |
| use Mautic\FormBundle\Entity\Submission; | |
| class FormUploader | |
| { | |
| public function __construct( | |
| private FileUploader $fileUploader, | |
| private CoreParametersHelper $coreParametersHelper | |
| ) { | |
| } | |
| /** | |
| * @throws FileUploadException | |
| */ | |
| public function uploadFiles(UploadFileCrate $filesToUpload, Submission $submission): void | |
| { | |
| $uploadedFiles = []; | |
| $result = $submission->getResults(); | |
| $alias = ''; // Only for IDE - will be overriden by foreach | |
| try { | |
| foreach ($filesToUpload as $fileFieldCrate) { | |
| $field = $fileFieldCrate->getField(); | |
| $alias = $field->getAlias(); | |
| $uploadDir = $this->getUploadDir($field); | |
| $fileName = $this->fileUploader->upload($uploadDir, $fileFieldCrate->getUploadedFile()); | |
| $result[$alias] = $fileName; | |
| $uploadedFile = $uploadDir.DIRECTORY_SEPARATOR.$fileName; | |
| $this->fixRotationJPG($uploadedFile); | |
| $uploadedFiles[] =$uploadedFile; | |
| } | |
| $submission->setResults($result); | |
| } catch (FileUploadException) { | |
| foreach ($uploadedFiles as $filePath) { | |
| $this->fileUploader->delete($filePath); | |
| } | |
| throw new FileUploadException($alias); | |
| } | |
| } | |
| /** | |
| * @param string $fileName | |
| */ | |
| public function getCompleteFilePath(Field $field, $fileName): string | |
| { | |
| $uploadDir = $this->getUploadDir($field); | |
| return $uploadDir.DIRECTORY_SEPARATOR.$fileName; | |
| } | |
| public function deleteAllFilesOfFormField(Field $field): void | |
| { | |
| if (!$field->isFileType()) { | |
| return; | |
| } | |
| $uploadDir = $this->getUploadDir($field); | |
| $this->fileUploader->delete($uploadDir); | |
| } | |
| public function deleteFilesOfForm(Form $form): void | |
| { | |
| $formId = $form->getId() ?: $form->deletedId; | |
| $formUploadDir = $this->getUploadDirOfForm($formId); | |
| $this->fileUploader->delete($formUploadDir); | |
| } | |
| /** | |
| * @todo Refactor code that result can be accessed normally and not only as a array of values | |
| */ | |
| public function deleteUploadedFiles(Submission $submission): void | |
| { | |
| $fields = $submission->getForm()->getFields(); | |
| foreach ($fields as $field) { | |
| $this->deleteFileOfFormField($submission, $field); | |
| } | |
| } | |
| private function deleteFileOfFormField(Submission $submission, Field $field): void | |
| { | |
| $alias = $field->getAlias(); | |
| $results = $submission->getResults(); | |
| if (!$field->isFileType() || empty($results[$alias])) { | |
| return; | |
| } | |
| $fileName = $results[$alias]; | |
| $filePath = $this->getCompleteFilePath($field, $fileName); | |
| $this->fileUploader->delete($filePath); | |
| } | |
| private function getUploadDir(Field $field): string | |
| { | |
| $fieldId = $field->getId(); | |
| $formUploadDir = $this->getUploadDirOfForm($field->getForm()->getId()); | |
| return $formUploadDir.DIRECTORY_SEPARATOR.$fieldId; | |
| } | |
| /** | |
| * @throws \LogicException If formId is null | |
| */ | |
| private function getUploadDirOfForm(int $formId): string | |
| { | |
| $uploadDir = $this->coreParametersHelper->get('form_upload_dir'); | |
| return $uploadDir.DIRECTORY_SEPARATOR.$formId; | |
| } | |
| /** | |
| * Fix iOS picture orientation after upload PHP | |
| * https://stackoverflow.com/questions/22308921/fix-ios-picture-orientation-after-upload-php. | |
| */ | |
| private function fixRotationJPG($filename): void | |
| { | |
| if (IMAGETYPE_JPEG != exif_imagetype($filename)) { | |
| return; | |
| } | |
| $exif = exif_read_data($filename); | |
| if (empty($exif['Orientation'])) { | |
| return; | |
| } | |
| $ort = $exif['Orientation']; /* STORES ORIENTATION FROM IMAGE */ | |
| $ort1 = $ort; | |
| if (!empty($ort1)) { | |
| $image = imagecreatefromjpeg($filename); | |
| $ort = $ort1; | |
| switch ($ort) { | |
| case 3: | |
| $image = imagerotate($image, 180, 0); | |
| break; | |
| case 6: | |
| $image = imagerotate($image, -90, 0); | |
| break; | |
| case 8: | |
| $image = imagerotate($image, 90, 0); | |
| break; | |
| } | |
| } | |
| imagejpeg($image, $filename, 90); | |
| } | |
| } | |