ExportController.php 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <?php
  2. namespace App\Controllers;
  3. use League\Flysystem\FileNotFoundException;
  4. use Psr\Http\Message\ResponseInterface as Response;
  5. use Psr\Http\Message\ServerRequestInterface as Request;
  6. use ZipStream\Option\Archive;
  7. use ZipStream\ZipStream;
  8. class ExportController extends Controller
  9. {
  10. /**
  11. * @param Request $request
  12. * @param Response $response
  13. * @param int|null $id
  14. * @return Response
  15. * @throws \Slim\Exception\HttpNotFoundException
  16. * @throws \Slim\Exception\HttpUnauthorizedException
  17. * @throws \ZipStream\Exception\OverflowException
  18. */
  19. public function downloadData(Request $request, Response $response, int $id): Response
  20. {
  21. $user = $this->getUser($request, $id, true);
  22. $medias = $this->database->query('SELECT `uploads`.`filename`, `uploads`.`storage_path` FROM `uploads` WHERE `user_id` = ?', $user->id);
  23. set_time_limit(0);
  24. ob_end_clean();
  25. $options = new Archive();
  26. $options->setSendHttpHeaders(true);
  27. $zip = new ZipStream($user->username.'-'.time().'-export.zip', $options);
  28. $filesystem = $this->storage;
  29. foreach ($medias as $media) {
  30. try {
  31. $zip->addFileFromStream($media->filename, $filesystem->readStream($media->storage_path));
  32. } catch (FileNotFoundException $e) {
  33. $this->logger->error('Cannot export file', ['exception' => $e]);
  34. }
  35. }
  36. $zip->finish();
  37. exit(0);
  38. }
  39. }