From d8a6e62c7faecc841930bdd58ff02f808c9af7e9 Mon Sep 17 00:00:00 2001 From: Aysel Afsar Date: Tue, 24 Dec 2024 03:02:41 -0500 Subject: [PATCH] #135 Add metadata for multi-frame images (#141) - Fix mimetype for wasm files --- lib/Controller/DisplayController.php | 35 +++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/Controller/DisplayController.php b/lib/Controller/DisplayController.php index d388ff4..08e00fa 100755 --- a/lib/Controller/DisplayController.php +++ b/lib/Controller/DisplayController.php @@ -66,6 +66,18 @@ public function __construct(IConfig $config, $this->dataFolder = $this->config->getSystemValue('datadirectory'); } + private function detectMimeType($path) { + $mimeType = $this->mimeTypeDetector->detectPath($path); + if ($mimeType === 'application/octet-stream') { + if (pathinfo($path, PATHINFO_EXTENSION) === 'wasm') { + $mimeType = 'application/wasm'; + } else { + $mimeType = mime_content_type($path); + } + } + return $mimeType; + } + private function getAppManager(): IAppManager { if ($this->appManager !== null) { return $this->appManager; @@ -282,6 +294,7 @@ private function generateDICOMJson($dicomFilePaths, $dicomFileNodes, $selectedFi $WindowCenter = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x1050)); $WindowWidth = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x1051)); $SeriesDate = $this->cleanDICOMTagValue($dicom->value(0x0008, 0x0021)); + $NumberOfFrames = $this->cleanDICOMTagValue($dicom->value(0x0028, 0x0008)); if (!$StudyInstanceUID || !$SeriesInstanceUID || !$SOPInstanceUID) { // Skip if any of the required tags are missing @@ -351,10 +364,20 @@ private function generateDICOMJson($dicomFilePaths, $dicomFileNodes, $selectedFi 'WindowCenter' => $WindowCenter ? explode('\\', $WindowCenter)[0] : $WindowCenter, 'WindowWidth' => $WindowWidth ? explode('\\', $WindowWidth)[0] : $WindowWidth, 'SeriesDate' => $SeriesDate, + 'NumberOfFrames' => $NumberOfFrames, ), 'url' => 'dicomweb:'.$fileUrl, ); - array_push($dicomJson['studies'][$studyIndex]['series'][$seriesIndex]['instances'], $instance); + + if ($NumberOfFrames > 1) { + for ($i = 1; $i <= $NumberOfFrames; $i++) { + $instance['url'] = 'dicomweb:'.$fileUrl.'?frame='.$i; + array_push($dicomJson['studies'][$studyIndex]['series'][$seriesIndex]['instances'], $instance); + } + } else { + array_push($dicomJson['studies'][$studyIndex]['series'][$seriesIndex]['instances'], $instance); + } + $dicomJson['studies'][$studyIndex]['NumInstances']++; if ($dicomJson['studies'][$studyIndex]['Modalities'] == '' || !in_array($Modality, explode(',', $dicomJson['studies'][$studyIndex]['Modalities']))) { if ($dicomJson['studies'][$studyIndex]['Modalities'] == '') { @@ -456,7 +479,7 @@ public function getDICOMViewerFile(string $filepath): StreamResponse { $response = new StreamResponse($fpHandle); $fileMimeType = mime_content_type($fullFilePath); $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($filename) . '"'); - $response->addHeader('Content-Type', $this->mimeTypeDetector->detectPath($fullFilePath)); + $response->addHeader('Content-Type', $this->detectMimeType($fullFilePath)); $response->setContentSecurityPolicy($this->getContentSecurityPolicy()); $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin'); $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp'); @@ -477,7 +500,7 @@ public function getDICOMViewerAsset(string $assetpath): StreamResponse { $response = new StreamResponse(fopen($fullFilePath, 'rb')); $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($filename) . '"'); - $response->addHeader('Content-Type', $this->mimeTypeDetector->detectPath($fullFilePath)); + $response->addHeader('Content-Type', $this->detectMimeType($fullFilePath)); $response->setContentSecurityPolicy($this->getContentSecurityPolicy()); $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin'); $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp'); @@ -498,7 +521,7 @@ public function getDICOMViewerAssetSub(string $assetpath): StreamResponse { $response = new StreamResponse(fopen($fullFilePath, 'rb')); $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($filename) . '"'); - $response->addHeader('Content-Type', $this->mimeTypeDetector->detectPath($fullFilePath)); + $response->addHeader('Content-Type', $this->detectMimeType($fullFilePath)); $response->setContentSecurityPolicy($this->getContentSecurityPolicy()); $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin'); $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp'); @@ -519,7 +542,7 @@ public function getDICOMViewerAssetImages(string $assetpath): StreamResponse { $response = new StreamResponse(fopen($fullFilePath, 'rb')); $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($filename) . '"'); - $response->addHeader('Content-Type', $this->mimeTypeDetector->detectPath($fullFilePath)); + $response->addHeader('Content-Type', $this->detectMimeType($fullFilePath)); $response->setContentSecurityPolicy($this->getContentSecurityPolicy()); $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin'); $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp'); @@ -540,7 +563,7 @@ public function getDICOMViewerAssetSubImages(string $assetpath): StreamResponse $response = new StreamResponse(fopen($fullFilePath, 'rb')); $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($filename) . '"'); - $response->addHeader('Content-Type', $this->mimeTypeDetector->detectPath($fullFilePath)); + $response->addHeader('Content-Type', $this->detectMimeType($fullFilePath)); $response->setContentSecurityPolicy($this->getContentSecurityPolicy()); $response->addHeader('Cross-Origin-Opener-Policy', 'same-origin'); $response->addHeader('Cross-Origin-Embedder-Policy', 'require-corp');