. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\Html; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomExportService; use Fisharebest\Webtrees\Tree; use League\Flysystem\FilesystemException; use League\Flysystem\UnableToWriteFile; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use RuntimeException; use function assert; use function fclose; use function fopen; use function pathinfo; use function redirect; use function rewind; use function route; use function strtolower; use const PATHINFO_EXTENSION; /** * Save a GEDCOM file on the server. */ class ExportGedcomServer implements RequestHandlerInterface { use ViewResponseTrait; private GedcomExportService $gedcom_export_service; /** * ExportGedcomServer constructor. * * @param GedcomExportService $gedcom_export_service */ public function __construct(GedcomExportService $gedcom_export_service) { $this->gedcom_export_service = $gedcom_export_service; } /** * @param ServerRequestInterface $request * * @return ResponseInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); assert($tree instanceof Tree); $data_filesystem = Registry::filesystem()->data(); $params = (array) $request->getParsedBody(); $filename = $params['filename'] ?? $tree->name(); // Force a ".ged" suffix if (strtolower(pathinfo($filename, PATHINFO_EXTENSION)) !== 'ged') { $filename .= '.ged'; } try { $stream = fopen('php://temp', 'wb+'); if ($stream === false) { throw new RuntimeException('Failed to create temporary stream'); } $this->gedcom_export_service->export($tree, $stream, true); rewind($stream); $data_filesystem->writeStream($filename, $stream); fclose($stream); /* I18N: %s is a filename */ FlashMessages::addMessage(I18N::translate('The family tree has been exported to %s.', Html::filename($filename)), 'success'); } catch (FilesystemException | UnableToWriteFile $ex) { FlashMessages::addMessage( I18N::translate('The file %s could not be created.', Html::filename($filename)) . '