. */ 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\Tree; use League\Flysystem\FilesystemInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use Throwable; 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; /** * @param ServerRequestInterface $request * * @return ResponseInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); assert($tree instanceof Tree); $data_filesystem = $request->getAttribute('filesystem.data'); assert($data_filesystem instanceof FilesystemInterface); $filename = $tree->name(); // Force a ".ged" suffix if (strtolower(pathinfo($filename, PATHINFO_EXTENSION)) !== 'ged') { $filename .= '.ged'; } try { $stream = fopen('php://temp', 'wb+'); $tree->exportGedcom($stream); rewind($stream); $data_filesystem->putStream($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 (Throwable $ex) { FlashMessages::addMessage( I18N::translate('The file %s could not be created.', Html::filename($filename)) . '
' . $ex->getMessage() . '', 'danger' ); } $url = route('manage-trees', ['tree' => $tree->name()]); return redirect($url); } }