From 9fff03a90a36dd23a4e3ce30e8bc9c96e6f99422 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Sun, 29 Nov 2020 02:42:18 +0800 Subject: [PATCH] MDL-68481 mod_folder: stream files when creating zip --- mod/folder/download_folder.php | 31 ++++++++++++++++++++----------- mod/folder/renderer.php | 3 ++- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/mod/folder/download_folder.php b/mod/folder/download_folder.php index 53d00053243..b3ed5b7e9c9 100644 --- a/mod/folder/download_folder.php +++ b/mod/folder/download_folder.php @@ -40,20 +40,29 @@ if (!$downloadable) { print_error('cannotdownloaddir', 'repository'); } +$fs = get_file_storage(); +$files = $fs->get_area_files($context->id, 'mod_folder', 'content'); +if (empty($files)) { + print_error('cannotdownloaddir', 'repository'); +} + +// Log zip as downloaded. folder_downloaded($folder, $course, $cm, $context); -$fs = get_file_storage(); -$file = $fs->get_file($context->id, 'mod_folder', 'content', 0, '/', '.'); -if (!$file) { - print_error('cannotdownloaddir', 'repository'); -} +// Close the session. +\core\session\manager::write_close(); -$zipper = get_file_packer('application/zip'); $filename = shorten_filename(clean_filename($folder->name . "-" . date("Ymd")) . ".zip"); -$temppath = make_request_directory() . $filename; +$zipwriter = \core_files\archive_writer::get_stream_writer($filename, \core_files\archive_writer::ZIP_WRITER); -if ($zipper->archive_to_pathname(array('/' => $file), $temppath)) { - send_temp_file($temppath, $filename); -} else { - print_error('cannotdownloaddir', 'repository'); +foreach ($files as $file) { + if ($file->is_directory()) { + continue; + } + $pathinzip = $file->get_filepath() . $file->get_filename(); + $zipwriter->add_file_from_stored_file($pathinzip, $file); } + +// Finish the archive. +$zipwriter->finish(); +exit(); diff --git a/mod/folder/renderer.php b/mod/folder/renderer.php index 74732f49171..91364b4149f 100644 --- a/mod/folder/renderer.php +++ b/mod/folder/renderer.php @@ -72,7 +72,8 @@ class mod_folder_renderer extends plugin_renderer_base { if ($downloadable) { $downloadbutton = $this->output->single_button( new moodle_url('/mod/folder/download_folder.php', array('id' => $cm->id)), - get_string('downloadfolder', 'folder') + get_string('downloadfolder', 'folder'), + 'get' ); $buttons .= $downloadbutton;