From 90fdf83ca7648418f899e28490f65de53fcd31d1 Mon Sep 17 00:00:00 2001 From: Daniel Calviño Sánchez Date: Tue, 6 Feb 2018 14:03:50 +0100 Subject: Use zip32 only if there are less than 65536 files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A zip32 file can contain, at most, 65535 files (and folders), so take that constraint into account. Signed-off-by: Daniel Calviño Sánchez --- lib/private/legacy/files.php | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'lib/private/legacy/files.php') diff --git a/lib/private/legacy/files.php b/lib/private/legacy/files.php index b7c99b7fef8..9281c1f7da4 100644 --- a/lib/private/legacy/files.php +++ b/lib/private/legacy/files.php @@ -146,17 +146,23 @@ class OC_Files { self::lockFiles($view, $dir, $files); - /* Calculate filesize */ + /* Calculate filesize and number of files */ if ($getType === self::ZIP_FILES) { + $fileInfos = array(); $fileSize = 0; foreach ($files as $file) { - $fileSize += \OC\Files\Filesystem::getFileInfo($dir . '/' . $file)->getSize(); + $fileInfo = \OC\Files\Filesystem::getFileInfo($dir . '/' . $file); + $fileSize += $fileInfo->getSize(); + $fileInfos[] = $fileInfo; } + $numberOfFiles = self::getNumberOfFiles($fileInfos); } elseif ($getType === self::ZIP_DIR) { - $fileSize = \OC\Files\Filesystem::getFileInfo($dir . '/' . $files)->getSize(); + $fileInfo = \OC\Files\Filesystem::getFileInfo($dir . '/' . $files); + $fileSize = $fileInfo->getSize(); + $numberOfFiles = self::getNumberOfFiles(array($fileInfo)); } - $streamer = new Streamer(\OC::$server->getRequest(), $fileSize); + $streamer = new Streamer(\OC::$server->getRequest(), $fileSize, $numberOfFiles); OC_Util::obEnd(); $streamer->sendHeaders($name); @@ -324,6 +330,29 @@ class OC_Files { } } + /** + * Returns the total (recursive) number of files and folders in the given + * FileInfos. + * + * @param \OCP\Files\FileInfo[] $fileInfos the FileInfos to count + * @return int the total number of files and folders + */ + private static function getNumberOfFiles($fileInfos) { + $numberOfFiles = 0; + + $view = new View(); + + while ($fileInfo = array_pop($fileInfos)) { + $numberOfFiles++; + + if ($fileInfo->getType() === \OCP\Files\FileInfo::TYPE_FOLDER) { + $fileInfos = array_merge($fileInfos, $view->getDirectoryContent($fileInfo->getPath())); + } + } + + return $numberOfFiles; + } + /** * @param View $view * @param string $dir -- cgit v1.2.3