From 7b977fc3e2d04d242424ce9601c5a19c7ce4c749 Mon Sep 17 00:00:00 2001 From: as6325400 Date: Sun, 22 Sep 2024 19:30:41 +0800 Subject: [PATCH] download file when submission is single source --- .../Controller/Team/SubmissionController.php | 4 +++ webapp/src/Service/SubmissionService.php | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/webapp/src/Controller/Team/SubmissionController.php b/webapp/src/Controller/Team/SubmissionController.php index e6cfbf223f..ae1f1823a1 100644 --- a/webapp/src/Controller/Team/SubmissionController.php +++ b/webapp/src/Controller/Team/SubmissionController.php @@ -236,6 +236,10 @@ public function downloadAction(int $submitId): Response $submitId)); } + if($this->submissionService->getSubmissionFileNums($submission) == 1){ + return $this->submissionService->getSubmissionFileResponse($submission); + } + return $this->submissionService->getSubmissionZipResponse($submission); } } diff --git a/webapp/src/Service/SubmissionService.php b/webapp/src/Service/SubmissionService.php index 1d01c96096..5426c95266 100644 --- a/webapp/src/Service/SubmissionService.php +++ b/webapp/src/Service/SubmissionService.php @@ -768,4 +768,33 @@ public function getSubmissionZipResponse(Submission $submission): StreamedRespon return Utils::streamZipFile($tmpfname, 's' . $submission->getSubmitid() . '.zip'); } + + public function getSubmissionFileResponse(Submission $submission): StreamedResponse + { + /** @var SubmissionFile[] $files */ + $files = $submission->getFiles(); + + if (count($files) !== 1) { + throw new ServiceUnavailableHttpException(null, 'Submission does not contain exactly one file.'); + } + + $file = $files[0]; + $filename = $file->getFilename(); + $sourceCode = $file->getSourcecode(); + + return new StreamedResponse(function () use ($sourceCode) { + echo $sourceCode; + }, 200, [ + 'Content-Type' => 'application/octet-stream', + 'Content-Disposition' => 'attachment; filename="' . $filename . '"', + 'Content-Length' => strlen($sourceCode), + ]); + } + + + public function getSubmissionFileNums(Submission $submission): int + { + $files = $submission->getFiles(); + return count($files); + } }