ExportController.php 1.4 KB

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