Skip to content

Commit 50ec040

Browse files
Merge pull request #6212 from christianbeeznest/GH-4735-4
Documents: Fix file upload behavior - refs #4735
2 parents 1f23364 + cd455c0 commit 50ec040

File tree

2 files changed

+40
-15
lines changed

2 files changed

+40
-15
lines changed

src/CoreBundle/Controller/Api/BaseResourceFileAction.php

+31-12
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Chamilo\CoreBundle\Component\Utils\CreateUploadedFile;
1010
use Chamilo\CoreBundle\Entity\AbstractResource;
1111
use Chamilo\CoreBundle\Entity\Course;
12+
use Chamilo\CoreBundle\Entity\ResourceFile;
1213
use Chamilo\CoreBundle\Entity\ResourceLink;
1314
use Chamilo\CoreBundle\Entity\ResourceNode;
1415
use Chamilo\CoreBundle\Entity\ResourceRight;
@@ -27,6 +28,7 @@
2728
use Symfony\Component\HttpFoundation\Request;
2829
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
2930
use Symfony\Component\HttpKernel\KernelInterface;
31+
use Symfony\Contracts\Translation\TranslatorInterface;
3032
use ZipArchive;
3133

3234
class BaseResourceFileAction
@@ -189,7 +191,8 @@ public function handleCreateFileRequest(
189191
ResourceRepository $resourceRepository,
190192
Request $request,
191193
EntityManager $em,
192-
string $fileExistsOption = ''
194+
string $fileExistsOption = '',
195+
TranslatorInterface $translator = null
193196
): array {
194197
$contentData = $request->getContent();
195198

@@ -253,11 +256,23 @@ public function handleCreateFileRequest(
253256
// Check if a document with the same title and parent resource node already exists
254257
$existingDocument = $resourceRepository->findByTitleAndParentResourceNode($title, $parentResourceNodeId);
255258
if ($existingDocument) {
256-
if ('overwrite' == $fileExistsOption) {
257-
// Perform actions when file exists and 'overwrite' option is selected
258-
$resource->setResourceName($title);
259+
if ('overwrite' === $fileExistsOption) {
259260
$existingDocument->setTitle($title);
260261
$existingDocument->setComment($comment);
262+
263+
$resourceNode = $existingDocument->getResourceNode();
264+
265+
$resourceFile = $resourceNode->getFirstResourceFile();
266+
if ($resourceFile instanceof ResourceFile) {
267+
$resourceFile->setFile($uploadedFile);
268+
$em->persist($resourceFile);
269+
} else {
270+
$existingDocument->setUploadFile($uploadedFile);
271+
}
272+
273+
$resourceNode->setUpdatedAt(new \DateTime());
274+
$existingDocument->setResourceNode($resourceNode);
275+
261276
$em->persist($existingDocument);
262277
$em->flush();
263278

@@ -282,7 +297,7 @@ public function handleCreateFileRequest(
282297

283298
// Return any data you need for further processing
284299
return [
285-
'title' => $title,
300+
'title' => $newTitle,
286301
'filetype' => 'file',
287302
'comment' => $comment,
288303
];
@@ -294,13 +309,10 @@ public function handleCreateFileRequest(
294309
// or perform any other desired actions based on your application's requirements
295310
$resource->setResourceName($title);
296311
$flashBag = $request->getSession()->getFlashBag();
297-
$flashBag->add('warning', 'Upload Already Exists');
312+
$message = $translator ? $translator->trans('upload.already_exists') : 'Upload Already Exists';
313+
$flashBag->add('warning', $message);
298314

299-
return [
300-
'title' => $title,
301-
'filetype' => 'file',
302-
'comment' => $comment,
303-
];
315+
throw new BadRequestHttpException($translator ? $translator->trans('file.already_exists') : 'The file already exists and was not uploaded.');
304316
}
305317

306318
throw new InvalidArgumentException('Invalid fileExistsOption');
@@ -614,8 +626,15 @@ private function formatFolderStructure(array $folderStructure): array
614626
return $result;
615627
}
616628

629+
/**
630+
* Generates a unique filename by appending a random suffix.
631+
*/
617632
private function generateUniqueTitle(string $title): string
618633
{
619-
return $title.'_'.uniqid();
634+
$info = pathinfo($title);
635+
$filename = $info['filename'];
636+
$extension = isset($info['extension']) ? '.'.$info['extension'] : '';
637+
638+
return $filename.'_'.uniqid().$extension;
620639
}
621640
}

src/CoreBundle/Controller/Api/CreateDocumentFileAction.php

+9-3
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,17 @@
1111
use Doctrine\ORM\EntityManager;
1212
use Symfony\Component\HttpFoundation\Request;
1313
use Symfony\Component\HttpKernel\KernelInterface;
14+
use Symfony\Contracts\Translation\TranslatorInterface;
1415

1516
class CreateDocumentFileAction extends BaseResourceFileAction
1617
{
17-
public function __invoke(Request $request, CDocumentRepository $repo, EntityManager $em, KernelInterface $kernel): CDocument
18-
{
18+
public function __invoke(
19+
Request $request,
20+
CDocumentRepository $repo,
21+
EntityManager $em,
22+
KernelInterface $kernel,
23+
TranslatorInterface $translator
24+
): CDocument {
1925
$isUncompressZipEnabled = $request->get('isUncompressZipEnabled', 'false');
2026
$fileExistsOption = $request->get('fileExistsOption', 'rename');
2127

@@ -24,7 +30,7 @@ public function __invoke(Request $request, CDocumentRepository $repo, EntityMana
2430
if ('true' === $isUncompressZipEnabled) {
2531
$result = $this->handleCreateFileRequestUncompress($document, $request, $em, $kernel);
2632
} else {
27-
$result = $this->handleCreateFileRequest($document, $repo, $request, $em, $fileExistsOption);
33+
$result = $this->handleCreateFileRequest($document, $repo, $request, $em, $fileExistsOption, $translator);
2834
}
2935

3036
$document->setTitle($result['title']);

0 commit comments

Comments
 (0)