1313use Chamilo \CoreBundle \Entity \Session ;
1414use Chamilo \CoreBundle \Entity \User ;
1515use Chamilo \CoreBundle \Helpers \AccessUrlHelper ;
16+ use Chamilo \CoreBundle \Helpers \ResourceFileHelper ;
1617use Chamilo \CoreBundle \Helpers \UserHelper ;
1718use Chamilo \CoreBundle \Repository \ResourceFileRepository ;
1819use Chamilo \CoreBundle \Repository \ResourceNodeRepository ;
@@ -144,8 +145,7 @@ public function diskSpace(Request $request): Response
144145 public function view (
145146 Request $ request ,
146147 TrackEDownloadsRepository $ trackEDownloadsRepository ,
147- SettingsManager $ settingsManager ,
148- AccessUrlHelper $ accessUrlHelper
148+ ResourceFileHelper $ resourceFileHelper ,
149149 ): Response {
150150 $ id = $ request ->get ('id ' );
151151 $ resourceFileId = $ request ->get ('resourceFileId ' );
@@ -161,26 +161,7 @@ public function view(
161161 $ resourceFile = $ this ->resourceFileRepository ->find ($ resourceFileId );
162162 }
163163
164- if (!$ resourceFile ) {
165- $ accessUrlSpecificFiles = $ settingsManager ->getSetting ('document.access_url_specific_files ' ) && $ accessUrlHelper ->isMultiple ();
166- $ currentUrl = $ accessUrlHelper ->getCurrent ()?->getUrl();
167-
168- $ resourceFiles = $ resourceNode ->getResourceFiles ();
169-
170- if ($ accessUrlSpecificFiles ) {
171- foreach ($ resourceFiles as $ file ) {
172- if ($ file ->getAccessUrl () && $ file ->getAccessUrl ()->getUrl () === $ currentUrl ) {
173- $ resourceFile = $ file ;
174-
175- break ;
176- }
177- }
178- }
179-
180- if (!$ resourceFile ) {
181- $ resourceFile = $ resourceFiles ->filter (fn ($ file ) => null === $ file ->getAccessUrl ())->first ();
182- }
183- }
164+ $ resourceFile ??= $ resourceFileHelper ->resolveResourceFileByAccessUrl ($ resourceNode );
184165
185166 if (!$ resourceFile ) {
186167 throw new FileNotFoundException ($ this ->trans ('Resource file not found for the given resource node ' ));
@@ -254,8 +235,7 @@ public function link(Request $request, RouterInterface $router, CLinkRepository
254235 public function download (
255236 Request $ request ,
256237 TrackEDownloadsRepository $ trackEDownloadsRepository ,
257- SettingsManager $ settingsManager ,
258- AccessUrlHelper $ accessUrlHelper
238+ ResourceFileHelper $ resourceFileHelper ,
259239 ): Response {
260240 $ id = $ request ->get ('id ' );
261241 $ resourceNode = $ this ->getResourceNodeRepository ()->findOneBy (['uuid ' => $ id ]);
@@ -272,23 +252,7 @@ public function download(
272252 $ this ->trans ('Unauthorised access to resource ' )
273253 );
274254
275- $ accessUrlSpecificFiles = $ settingsManager ->getSetting ('document.access_url_specific_files ' ) && $ accessUrlHelper ->isMultiple ();
276- $ currentUrl = $ accessUrlHelper ->getCurrent ()?->getUrl();
277-
278- $ resourceFiles = $ resourceNode ->getResourceFiles ();
279- $ resourceFile = null ;
280-
281- if ($ accessUrlSpecificFiles ) {
282- foreach ($ resourceFiles as $ file ) {
283- if ($ file ->getAccessUrl () && $ file ->getAccessUrl ()->getUrl () === $ currentUrl ) {
284- $ resourceFile = $ file ;
285-
286- break ;
287- }
288- }
289- }
290-
291- $ resourceFile ??= $ resourceFiles ->filter (fn ($ file ) => null === $ file ->getAccessUrl ())->first ();
255+ $ resourceFile = $ resourceFileHelper ->resolveResourceFileByAccessUrl ($ resourceNode );
292256
293257 // If resource node has a file just download it. Don't download the children.
294258 if ($ resourceFile ) {
@@ -688,21 +652,24 @@ private function processFile(Request $request, ResourceNode $resourceNode, strin
688652
689653 $ response = new StreamedResponse (
690654 function () use ($ resourceNodeRepo , $ resourceFile , $ start , $ length ): void {
691- $ this ->streamFileContent ($ resourceNodeRepo , $ resourceFile , $ start , $ length );
655+ $ stream = $ resourceNodeRepo ->getResourceNodeFileStream (
656+ $ resourceFile ->getResourceNode (),
657+ $ resourceFile
658+ );
659+
660+ $ this ->echoBuffer ($ stream , $ start , $ length );
692661 }
693662 );
694663
695- $ disposition = $ response ->headers ->makeDisposition (
696- $ forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE ,
697- $ fileName
698- );
699- $ response ->headers ->set ('Content-Disposition ' , $ disposition );
700- $ response ->headers ->set ('Content-Type ' , $ mimeType ?: 'application/octet-stream ' );
701- $ response ->headers ->set ('Content-Length ' , (string ) $ length );
702- $ response ->headers ->set ('Accept-Ranges ' , 'bytes ' );
703- $ response ->headers ->set ('Content-Range ' , "bytes $ start- $ end/ $ fileSize " );
704- $ response ->setStatusCode (
705- $ start > 0 || $ end < $ fileSize - 1 ? Response::HTTP_PARTIAL_CONTENT : Response::HTTP_OK
664+ $ this ->setHeadersToStreamedResponse (
665+ $ response ,
666+ $ forceDownload ,
667+ $ fileName ,
668+ $ mimeType ?: 'application/octet-stream ' ,
669+ $ length ,
670+ $ start ,
671+ $ end ,
672+ $ fileSize
706673 );
707674
708675 return $ response ;
@@ -821,45 +788,4 @@ private function normalizeGeneratedHtml(string $content): string
821788
822789 return $ normalized ;
823790 }
824-
825-
826- private function getRange (Request $ request , int $ fileSize ): array
827- {
828- $ range = $ request ->headers ->get ('Range ' );
829-
830- if ($ range ) {
831- [, $ range ] = explode ('= ' , $ range , 2 );
832- [$ start , $ end ] = explode ('- ' , $ range );
833-
834- $ start = (int ) $ start ;
835- $ end = ('' === $ end ) ? $ fileSize - 1 : (int ) $ end ;
836-
837- $ length = $ end - $ start + 1 ;
838- } else {
839- $ start = 0 ;
840- $ end = $ fileSize - 1 ;
841- $ length = $ fileSize ;
842- }
843-
844- return [$ start , $ end , $ length ];
845- }
846-
847- private function streamFileContent (ResourceNodeRepository $ resourceNodeRepo , ResourceFile $ resourceFile , int $ start , int $ length ): void
848- {
849- $ stream = $ resourceNodeRepo ->getResourceNodeFileStream ($ resourceFile ->getResourceNode (), $ resourceFile );
850-
851- fseek ($ stream , $ start );
852-
853- $ bytesSent = 0 ;
854-
855- while ($ bytesSent < $ length && !feof ($ stream )) {
856- $ buffer = fread ($ stream , min (1024 * 8 , $ length - $ bytesSent ));
857-
858- echo $ buffer ;
859-
860- $ bytesSent += \strlen ($ buffer );
861- }
862-
863- fclose ($ stream );
864- }
865791}
0 commit comments