diff --git a/app/Entities/ExportService.php b/app/Entities/ExportService.php index 1b294d8b1..b0e88b18b 100644 --- a/app/Entities/ExportService.php +++ b/app/Entities/ExportService.php @@ -8,6 +8,7 @@ use Exception; use SnappyPDF; use League\HTMLToMarkdown\HtmlConverter; use Throwable; +use ZipArchive; class ExportService { @@ -271,4 +272,27 @@ class ExportService } return $text; } + + /** + * Convert a book into a zip file. + */ + public function bookToZip(Book $book): string + { + // TODO: Is not unlinking the file a security risk? + $z = new ZipArchive(); + $z->open("book.zip", \ZipArchive::CREATE | \ZipArchive::OVERWRITE); + $bookTree = (new BookContents($book))->getTree(false, true); + foreach ($bookTree as $bookChild) { + if ($bookChild->isA('chapter')) { + $z->addEmptyDir($bookChild->name); + foreach ($bookChild->pages as $page) { + $filename = $bookChild->name . "/" . $page->name . ".md"; + $z->addFromString($filename, $this->pageToMarkdown($page)); + } + } else { + $z->addFromString($bookChild->name . ".md", $this->pageToMarkdown($bookChild)); + } + } + return "book.zip"; + } } diff --git a/app/Http/Controllers/BookExportController.php b/app/Http/Controllers/BookExportController.php index 0414b7250..a92d94cc9 100644 --- a/app/Http/Controllers/BookExportController.php +++ b/app/Http/Controllers/BookExportController.php @@ -6,7 +6,6 @@ use BookStack\Entities\Managers\BookContents; use BookStack\Entities\ExportService; use BookStack\Entities\Repos\BookRepo; use Throwable; -use ZipArchive; class BookExportController extends Controller { @@ -72,20 +71,7 @@ class BookExportController extends Controller public function zip(string $bookSlug) { $book = $this->bookRepo->getBySlug($bookSlug); - $z = new ZipArchive(); - $z->open("book.zip", \ZipArchive::CREATE | \ZipArchive::OVERWRITE); - $bookTree = (new BookContents($book))->getTree(false, true); - foreach ($bookTree as $bookChild) { - if ($bookChild->isA('chapter')) { - $z->addEmptyDir($bookChild->name); - foreach ($bookChild->pages as $page) { - $z->addFromString($bookChild->name . "/" . $page->name . ".md", $this->exportService->pageToMarkdown($page)); - } - } else { - $z->addFromString($bookChild->name . ".md", $this->exportService->pageToMarkdown($bookChild)); - } - } - return response()->download('book.zip'); - // TODO: Is not unlinking it a security issue? + $filename = $this->exportService->bookToZip($book); + return response()->download($filename); } }