public function replaceFile(File $fileEntity, UploadedFile $file) { $entityManager = $this->getDoctrineEntityManager(); $oldFileIsImage = $fileEntity instanceof Image; $newFileIsImage = $this->isMimeTypeImage($file->getMimeType()); if ($oldFileIsImage !== $newFileIsImage) { throw new Exception\UploadFilterException(self::VALIDATION_IMAGE_TO_FILE_REPLACE_MESSAGE_KEY, 'New file should be image too'); } $originalFile = clone $fileEntity; $entityManager->detach($originalFile); // setting new data // The name is not changed by Bug #6756 // $fileEntity->setFileName($file['name']); $fileEntity->setSize($file->getSize()); $fileEntity->setMimeType($file->getMimeType()); // This must be call before removing the old file $this->validateFileUpload($fileEntity, $file->getPathname()); $this->removeFileInFileSystem($originalFile); $this->storeFileData($fileEntity, $file->getPathname()); // additional jobs for images if ($fileEntity instanceof Image) { $imageProcessor = $this->getImageResizer(); // store original size $imageInfo = $imageProcessor->getImageInfo($fileEntity); $fileEntity->setWidth($imageInfo->getWidth()); $fileEntity->setHeight($imageInfo->getHeight()); // reprocess sizes $this->recreateImageSizes($fileEntity); } $fileEntity->setModificationTime(); $entityManager->flush(); }