Completed
Push — master ( 2d4e5c...386374 )
by Julito
15:19
created

ResourceController::createResource()   F

Complexity

Conditions 28
Paths 5232

Size

Total Lines 219
Code Lines 137

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 28
eloc 137
nc 5232
nop 2
dl 0
loc 219
rs 0
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/* For licensing terms, see /license.txt */
3
4
namespace Chamilo\CoreBundle\Controller;
5
6
use APY\DataGridBundle\Grid\Action\MassAction;
7
use APY\DataGridBundle\Grid\Action\RowAction;
8
use APY\DataGridBundle\Grid\Export\CSVExport;
9
use APY\DataGridBundle\Grid\Export\ExcelExport;
10
use APY\DataGridBundle\Grid\Grid;
11
use APY\DataGridBundle\Grid\Source\Entity;
12
use Chamilo\CoreBundle\Component\Utils\Glide;
13
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
14
use Chamilo\CoreBundle\Entity\Resource\ResourceRight;
15
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
16
use Chamilo\CourseBundle\Controller\CourseControllerInterface;
17
use Chamilo\CourseBundle\Controller\CourseControllerTrait;
18
use Chamilo\CourseBundle\Entity\CDocument;
19
use Chamilo\CourseBundle\Repository\CDocumentRepository;
20
use FOS\RestBundle\View\View;
21
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
22
use Sylius\Component\Resource\Exception\UpdateHandlingException;
23
use Sylius\Component\Resource\ResourceActions;
24
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
25
use Symfony\Component\HttpFoundation\RedirectResponse;
26
use Symfony\Component\HttpFoundation\Request;
27
use Symfony\Component\HttpFoundation\Response;
28
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
29
use Symfony\Component\HttpFoundation\StreamedResponse;
30
use Symfony\Component\HttpKernel\Exception\HttpException;
31
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
32
use Symfony\Component\Routing\Annotation\Route;
33
use Vich\UploaderBundle\Util\Transliterator;
34
35
/**
36
 * Class ResourceController.
37
 *
38
 * @author Julio Montoya <[email protected]>.
39
 */
40
class ResourceController extends BaseController implements CourseControllerInterface
41
{
42
    use CourseControllerTrait;
43
44
    /**
45
     * @param Request $request
46
     *
47
     * @return Response
48
     */
49
    public function indexAction(Request $request): Response
50
    {
51
52
        return [];
0 ignored issues
show
Bug Best Practice introduced by
The expression return array() returns the type array which is incompatible with the type-hinted return Symfony\Component\HttpFoundation\Response.
Loading history...
53
54
        $source = new Entity('ChamiloCourseBundle:CDocument');
0 ignored issues
show
Unused Code introduced by
$source = new APY\DataGr...ourseBundle:CDocument') is not reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
55
56
        /* @var Grid $grid */
57
        $grid = $this->get('grid');
58
59
        /*$tableAlias = $source->getTableAlias();
60
        $source->manipulateQuery(function (QueryBuilder $query) use ($tableAlias, $course) {
61
                $query->andWhere($tableAlias . '.cId = '.$course->getId());
62
                //$query->resetDQLPart('orderBy');
63
            }
64
        );*/
65
66
        $repository = $this->get('Chamilo\CourseBundle\Repository\CDocumentRepository');
67
68
        $course = $this->getCourse();
69
        $tool = $repository->getTool('document');
70
71
        $parentId = $request->get('parent');
72
        $parent = null;
73
        if (!empty($parentId)) {
74
            $parent = $repository->find($parentId);
75
        }
76
        $resources = $repository->getResourcesByCourse($course, $tool, $parent);
77
78
        $source->setData($resources);
79
        $grid->setSource($source);
80
81
        //$grid->hideFilters();
82
        $grid->setLimits(20);
83
        //$grid->isReadyForRedirect();
84
        //$grid->setMaxResults(1);
85
        //$grid->setLimits(2);
86
        /*$grid->getColumn('id')->manipulateRenderCell(
87
            function ($value, $row, $router) use ($course) {
88
                //$router = $this->get('router');
89
                return $router->generate(
90
                    'chamilo_notebook_show',
91
                    array('id' => $row->getField('id'), 'course' => $course)
92
                );
93
            }
94
        );*/
95
96
        $courseIdentifier = $course->getCode();
97
98
        if ($this->isGranted(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)) {
99
            $deleteMassAction = new MassAction(
100
                'Delete',
101
                'chamilo.controller.notebook:deleteMassAction',
102
                true,
103
                ['course' => $courseIdentifier]
104
            );
105
            $grid->addMassAction($deleteMassAction);
106
        }
107
108
        $translation = $this->container->get('translator');
109
110
        $myRowAction = new RowAction(
111
            $translation->trans('View'),
112
            'app_document_show',
113
            false,
114
            '_self',
115
            ['class' => 'btn btn-secondary']
116
        );
117
        $myRowAction->setRouteParameters(['course' => $courseIdentifier, 'id']);
118
        $grid->addRowAction($myRowAction);
119
120
        if ($this->isGranted(ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER)) {
121
            $myRowAction = new RowAction(
122
                $translation->trans('Edit'),
123
                'app_document_update',
124
                false,
125
                '_self',
126
                ['class' => 'btn btn-secondary']
127
            );
128
            $myRowAction->setRouteParameters(['course' => $courseIdentifier, 'id']);
129
            $grid->addRowAction($myRowAction);
130
131
            $myRowAction = new RowAction(
132
                $translation->trans('Delete'),
133
                'app_document_delete',
134
                false,
135
                '_self',
136
                ['class' => 'btn btn-danger', 'form_delete' => true]
137
            );
138
            $myRowAction->setRouteParameters(['course' => $courseIdentifier, 'id']);
139
            $grid->addRowAction($myRowAction);
140
        }
141
142
        $grid->addExport(new CSVExport($translation->trans('CSV Export'), 'export', ['course' => $courseIdentifier]));
143
144
        $grid->addExport(
145
            new ExcelExport(
146
                $translation->trans('Excel Export'),
147
                'export',
148
                ['course' => $courseIdentifier]
149
            )
150
        );
151
152
        return $grid->getGridResponse('ChamiloCoreBundle:Document:index.html.twig', ['parent_id' => $parentId]);
153
    }
154
155
    public function listAction(Request $request, $type): Response
156
    {
157
        $source = new Entity('ChamiloCourseBundle:CDocument');
158
159
        /* @var Grid $grid */
160
        $grid = $this->get('grid');
161
162
        return $grid->getGridResponse('@ChamiloCore/Resource/index.html.twig', ['grid' => $grid]);
163
    }
164
165
    /**
166
     * @param Request $request
167
     * @param string  $fileType
168
     *
169
     * @return RedirectResponse|Response|null
170
     */
171
    public function createResource(Request $request, $fileType = 'file')
172
    {
173
        $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
174
175
        $this->isGrantedOr403($configuration, ResourceActions::CREATE);
176
        /** @var CDocument $newResource */
177
        $newResource = $this->newResourceFactory->create($configuration, $this->factory);
178
        $form = $this->resourceFormFactory->create($configuration, $newResource);
179
180
        $course = $this->getCourse();
181
        $session = $this->getSession();
182
        $newResource->setCourse($course);
183
        $newResource->c_id = $course->getId();
184
        $newResource->setFiletype($fileType);
185
        $form->setData($newResource);
186
187
        $parentId = $request->get('parent');
188
        $parent = null;
189
        if (!empty($parentId)) {
190
            /** @var CDocument $parent */
191
            $parent = $this->repository->find($parentId);
192
        }
193
194
        if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
195
            /** @var CDocument $newResource */
196
            $newResource = $form->getData();
197
            $event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource);
198
199
            if ($event->isStopped() && !$configuration->isHtmlRequest()) {
200
                throw new HttpException($event->getErrorCode(), $event->getMessage());
201
            }
202
            if ($event->isStopped()) {
203
                $this->flashHelper->addFlashFromEvent($configuration, $event);
204
205
                if ($event->hasResponse()) {
206
                    return $event->getResponse();
207
                }
208
209
                return $this->redirectHandler->redirectToIndex($configuration, $newResource);
210
            }
211
212
            if ($configuration->hasStateMachine()) {
213
                $this->stateMachine->apply($configuration, $newResource);
214
            }
215
216
            //$sharedType = $form->get('shared')->getData();
217
            $shareList = [];
218
            $sharedType = 'this_course';
219
220
            switch ($sharedType) {
221
                case 'this_course':
222
                    if (empty($course)) {
223
                        break;
224
                    }
225
                    // Default Chamilo behaviour:
226
                    // Teachers can edit and students can see
227
                    $shareList = [
228
                        [
229
                            'sharing' => 'course',
230
                            'mask' => ResourceNodeVoter::getReaderMask(),
231
                            'role' => ResourceNodeVoter::ROLE_CURRENT_COURSE_STUDENT,
232
                            'search' => $course->getId(),
233
                        ],
234
                        [
235
                            'sharing' => 'course',
236
                            'mask' => ResourceNodeVoter::getEditorMask(),
237
                            'role' => ResourceNodeVoter::ROLE_CURRENT_COURSE_TEACHER,
238
                            'search' => $course->getId(),
239
                        ],
240
                    ];
241
                    break;
242
                case 'shared':
243
                    $shareList = $form->get('rights')->getData();
244
                    break;
245
                case 'only_me':
246
                    $shareList = [
247
                        [
248
                            'sharing' => 'user',
249
                            'only_me' => true,
250
                        ],
251
                    ];
252
                    break;
253
            }
254
255
            $resourceNode = $repository->addResourceNode($newResource, $this->getUser(), $parent);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $repository seems to be never defined.
Loading history...
256
257
            // Loops all sharing options
258
            foreach ($shareList as $share) {
259
                $idList = [];
260
                if (isset($share['search'])) {
261
                    $idList = explode(',', $share['search']);
262
                }
263
264
                $resourceRight = null;
265
                if (isset($share['mask'])) {
266
                    $resourceRight = new ResourceRight();
267
                    $resourceRight
268
                        ->setMask($share['mask'])
269
                        ->setRole($share['role'])
270
                    ;
271
                }
272
273
                // Build links
274
                switch ($share['sharing']) {
275
                    case 'everyone':
276
                        $repository->addResourceToEveryone(
277
                            $resourceNode,
278
                            $resourceRight
279
                        );
280
                        break;
281
                    case 'course':
282
                        $repository->addResourceToCourse(
283
                            $resourceNode,
284
                            $course,
285
                            $resourceRight
286
                        );
287
                        break;
288
                    case 'session':
289
                        $repository->addResourceToSession(
290
                            $resourceNode,
291
                            $course,
292
                            $session,
293
                            $resourceRight
294
                        );
295
                        break;
296
                    case 'user':
297
                        // Only for me
298
                        if (isset($share['only_me'])) {
299
                            $repository->addResourceOnlyToMe($resourceNode);
300
                        } else {
301
                            // To other users
302
                            $repository->addResourceToUserList($resourceNode, $idList);
303
                        }
304
                        break;
305
                    case 'group':
306
                        // @todo
307
                        break;
308
                }
309
            }
310
311
            $newResource
312
                ->setCourse($course)
313
                ->setFiletype($fileType)
314
                ->setSession($session)
315
                //->setTitle($title)
316
                //->setComment($comment)
317
                ->setReadonly(false)
318
                ->setResourceNode($resourceNode)
319
            ;
320
321
            $path = \URLify::filter($newResource->getTitle());
322
323
            switch ($fileType) {
324
                case 'folder':
325
                    $newResource
326
                        ->setPath($path)
327
                        ->setSize(0)
328
                    ;
329
                    break;
330
                case 'file':
331
                    $newResource
332
                        ->setPath($path)
333
                        ->setSize(0)
334
                    ;
335
                    break;
336
            }
337
338
            $this->repository->add($newResource);
339
            $postEvent = $this->eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource);
340
341
            $newResource->setId($newResource->getIid());
342
            $this->getDoctrine()->getManager()->persist($newResource);
343
            $this->getDoctrine()->getManager()->flush();
344
345
            if (!$configuration->isHtmlRequest()) {
346
                return $this->viewHandler->handle($configuration, View::create($newResource, Response::HTTP_CREATED));
347
            }
348
349
            $this->addFlash('success', 'saved');
350
351
            //$this->flashHelper->addSuccessFlash($configuration, ResourceActions::CREATE, $newResource);
352
            if ($postEvent->hasResponse()) {
353
                return $postEvent->getResponse();
354
            }
355
356
            return $this->redirectToRoute(
357
                'app_document_show',
358
                [
359
                    'id' => $newResource->getIid(),
360
                    'course' => $course->getCode(),
361
                    'parent_id' => $parentId,
362
                ]
363
            );
364
            //return $this->redirectHandler->redirectToResource($configuration, $newResource);
365
        }
366
367
        if (!$configuration->isHtmlRequest()) {
368
            return $this->viewHandler->handle($configuration, View::create($form, Response::HTTP_BAD_REQUEST));
369
        }
370
371
        $initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource);
372
        if ($initializeEvent->hasResponse()) {
373
            return $initializeEvent->getResponse();
374
        }
375
376
        $view = View::create()
377
            ->setData([
378
                'configuration' => $configuration,
379
                'metadata' => $this->metadata,
380
                'resource' => $newResource,
381
                $this->metadata->getName() => $newResource,
382
                'form' => $form->createView(),
383
                'parent_id' => $parentId,
384
                'file_type' => $fileType,
385
            ])
386
            ->setTemplate($configuration->getTemplate(ResourceActions::CREATE.'.html'))
387
        ;
388
389
        return $this->viewHandler->handle($configuration, $view);
390
    }
391
392
    /**
393
     * @param Request $request
394
     *
395
     * @return Response
396
     */
397
    public function createAction(Request $request): Response
398
    {
399
        return $this->createResource($request, 'folder');
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->createResource($request, 'folder') could return the type null which is incompatible with the type-hinted return Symfony\Component\HttpFoundation\Response. Consider adding an additional type-check to rule them out.
Loading history...
400
    }
401
402
    /**
403
     * @param Request $request
404
     *
405
     * @return Response
406
     */
407
    public function createDocumentAction(Request $request): Response
408
    {
409
        return $this->createResource($request, 'file');
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->createResource($request, 'file') could return the type null which is incompatible with the type-hinted return Symfony\Component\HttpFoundation\Response. Consider adding an additional type-check to rule them out.
Loading history...
410
    }
411
412
    /**
413
     * Shows a resource.
414
     *
415
     * @param Request             $request
416
     * @param Glide               $glide
417
     *
418
     * @return Response
419
     */
420
    public function getResourceFileAction(Request $request, Glide $glide): Response
421
    {
422
        $id = $request->get('id');
423
        $filter = $request->get('filter');
424
        $em = $this->getDoctrine();
425
        $resourceNode = $em->getRepository('ChamiloCoreBundle:Resource\ResourceNode')->find($id);
426
427
        if ($resourceNode === null) {
428
            throw new FileNotFoundException('Not found');
429
        }
430
431
        return $this->showFile($request, $resourceNode, $glide, 'show', $filter);
432
    }
433
434
    /**
435
     * Shows a resource.
436
     *
437
     * @param Request             $request
438
     * @param CDocumentRepository $documentRepo
439
     * @param Glide               $glide
440
     *
441
     * @return Response
442
     */
443
    public function showAction(Request $request): Response
444
    {
445
        $em = $this->getDoctrine();
446
447
        $id = $request->get('id');
448
        $resourceNode = $em->getRepository('ChamiloCoreBundle:Resource\ResourceNode')->find($id);
449
450
        if (null === $resourceNode) {
451
            throw new NotFoundHttpException();
452
        }
453
454
        $this->denyAccessUnlessGranted(
455
            ResourceNodeVoter::VIEW,
456
            $resourceNode,
457
            'Unauthorised access to resource'
458
        );
459
460
        $params = [
461
            'resource_node' => $resourceNode,
462
        ];
463
        return $this->render('@ChamiloCore/Resource/info.html.twig', $params);
464
    }
465
466
    /**
467
     * @param Request             $request
468
     * @param CDocumentRepository $documentRepo
469
     * @param Glide               $glide
470
     *
471
     * @return Response
472
     * @throws \League\Flysystem\FileNotFoundException
473
     */
474
    public function getDocumentAction(Request $request, CDocumentRepository $documentRepo, Glide $glide): Response
475
    {
476
        $file = $request->get('file');
477
        $type = $request->get('type');
478
        // see list of filters in config/services.yaml
479
        $filter = $request->get('filter');
480
        $type = !empty($type) ? $type : 'show';
481
        $criteria = [
482
            'path' => "/$file",
483
            'course' => $this->getCourse(),
484
        ];
485
486
        $document = $documentRepo->findOneBy($criteria);
487
488
        if (null === $document) {
489
            throw new NotFoundHttpException();
490
        }
491
        /** @var ResourceNode $resourceNode */
492
        $resourceNode = $document->getResourceNode();
493
494
        return $this->showFile($request, $resourceNode, $glide, $type, $filter);
495
    }
496
497
    /**
498
     * @param Request $request
499
     *
500
     * @return Response
501
     */
502
    public function updateAction(Request $request): Response
503
    {
504
        $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
505
506
        $this->isGrantedOr403($configuration, ResourceActions::UPDATE);
507
        /** @var CDocument $resource */
508
        $resource = $this->findOr404($configuration);
509
        $resourceNode = $resource->getResourceNode();
510
511
        $this->denyAccessUnlessGranted(
512
            ResourceNodeVoter::EDIT,
513
            $resourceNode,
514
            'Unauthorised access to resource'
515
        );
516
517
        $form = $this->resourceFormFactory->create($configuration, $resource);
518
519
        if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'], true) && $form->handleRequest($request)->isValid()) {
520
            $resource = $form->getData();
521
522
            /** @var ResourceControllerEvent $event */
523
            $event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::UPDATE, $configuration, $resource);
524
525
            if ($event->isStopped() && !$configuration->isHtmlRequest()) {
526
                throw new HttpException($event->getErrorCode(), $event->getMessage());
527
            }
528
            if ($event->isStopped()) {
529
                $this->flashHelper->addFlashFromEvent($configuration, $event);
530
531
                if ($event->hasResponse()) {
532
                    return $event->getResponse();
533
                }
534
535
                return $this->redirectHandler->redirectToResource($configuration, $resource);
536
            }
537
538
            try {
539
                $this->resourceUpdateHandler->handle($resource, $configuration, $this->manager);
540
            } catch (UpdateHandlingException $exception) {
541
                if (!$configuration->isHtmlRequest()) {
542
                    return $this->viewHandler->handle(
543
                        $configuration,
544
                        View::create($form, $exception->getApiResponseCode())
545
                    );
546
                }
547
548
                $this->flashHelper->addErrorFlash($configuration, $exception->getFlash());
549
550
                return $this->redirectHandler->redirectToReferer($configuration);
551
            }
552
553
            $postEvent = $this->eventDispatcher->dispatchPostEvent(ResourceActions::UPDATE, $configuration, $resource);
554
555
            if (!$configuration->isHtmlRequest()) {
556
                $view = $configuration->getParameters()->get('return_content', false) ? View::create($resource, Response::HTTP_OK) : View::create(null, Response::HTTP_NO_CONTENT);
557
558
                return $this->viewHandler->handle($configuration, $view);
559
            }
560
561
            $this->flashHelper->addSuccessFlash($configuration, ResourceActions::UPDATE, $resource);
562
563
            if ($postEvent->hasResponse()) {
564
                return $postEvent->getResponse();
565
            }
566
567
            return $this->redirectHandler->redirectToResource($configuration, $resource);
568
        }
569
570
        if (!$configuration->isHtmlRequest()) {
571
            return $this->viewHandler->handle($configuration, View::create($form, Response::HTTP_BAD_REQUEST));
572
        }
573
574
        $initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::UPDATE, $configuration, $resource);
575
        if ($initializeEvent->hasResponse()) {
576
            return $initializeEvent->getResponse();
577
        }
578
579
        $view = View::create()
580
            ->setData([
581
                'configuration' => $configuration,
582
                'metadata' => $this->metadata,
583
                'resource' => $resource,
584
                $this->metadata->getName() => $resource,
585
                'form' => $form->createView(),
586
            ])
587
            ->setTemplate($configuration->getTemplate(ResourceActions::UPDATE.'.html'))
588
        ;
589
590
        return $this->viewHandler->handle($configuration, $view);
591
    }
592
    /**
593
     * @param Request      $request
594
     * @param ResourceNode $resourceNode
595
     * @param Glide        $glide
596
     * @param              $type
597
     * @param string       $filter
598
     *
599
     * @return mixed|StreamedResponse
600
     * @throws \League\Flysystem\FileNotFoundException
601
     */
602
    private function showFile(Request $request, ResourceNode $resourceNode, Glide $glide, $type, $filter = '')
603
    {
604
        $fs = $this->container->get('oneup_flysystem.resources_filesystem');
605
606
        $this->denyAccessUnlessGranted(
607
            ResourceNodeVoter::VIEW,
608
            $resourceNode,
609
            'Unauthorised access to resource'
610
        );
611
        $resourceFile = $resourceNode->getResourceFile();
612
613
        if (!$resourceFile) {
0 ignored issues
show
introduced by
$resourceFile is of type Chamilo\CoreBundle\Entity\Resource\ResourceFile, thus it always evaluated to true.
Loading history...
614
            throw new NotFoundHttpException();
615
        }
616
617
        $fileName = $resourceNode->getName();
618
        $filePath = $resourceFile->getFile()->getPathname();
619
        $mimeType = $resourceFile->getMimeType();
620
621
        switch ($type) {
622
            case 'download':
623
                $forceDownload = true;
624
                break;
625
            case 'show':
626
            default:
627
                $forceDownload = false;
628
                if (strpos($mimeType, 'image') !== false) {
629
                    $server = $glide->getServer();
630
                    $params = $request->query->all();
631
632
                    // The filter overwrites the params from get
633
                    if (!empty($filter)) {
634
                        $params = $glide->getFilters()[$filter] ?? [];
635
                    }
636
637
                    // The image was cropped manually by the user, so we force to render this version,
638
                    // no matter other crop parameters.
639
                    $crop = $resourceFile->getCrop();
640
                    if (!empty($crop)) {
641
                        $params['crop'] = $crop;
642
                    }
643
644
                    return $server->getImageResponse($filePath, $params);
645
                }
646
                break;
647
        }
648
649
        $stream = $fs->readStream($filePath);
650
        $response = new StreamedResponse(function () use ($stream): void {
651
            stream_copy_to_stream($stream, fopen('php://output', 'wb'));
0 ignored issues
show
Bug introduced by
It seems like fopen('php://output', 'wb') can also be of type false; however, parameter $dest of stream_copy_to_stream() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

651
            stream_copy_to_stream($stream, /** @scrutinizer ignore-type */ fopen('php://output', 'wb'));
Loading history...
652
        });
653
        $disposition = $response->headers->makeDisposition(
654
            $forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE,
655
            Transliterator::transliterate($fileName)
656
        );
657
        $response->headers->set('Content-Disposition', $disposition);
658
        $response->headers->set('Content-Type', $mimeType ?: 'application/octet-stream');
659
660
        return $response;
661
    }
662
663
    /**
664
     * Upload form.
665
     *
666
     * @Route("/upload/{type}/{id}", name="resource_upload", methods={"GET", "POST"}, options={"expose"=true})
667
     *
668
     * @return Response
669
     */
670
    public function showUploadFormAction($type, $id): Response
671
    {
672
        //$helper = $this->container->get('oneup_uploader.templating.uploader_helper');
673
        //$endpoint = $helper->endpoint('courses');
674
        return $this->render(
675
            '@ChamiloCore/Resource/upload.html.twig',
676
            [
677
                'identifier' => $id,
678
                'type' => $type,
679
            ]
680
        );
681
    }
682
}
683