diff options
author | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2019-12-12 22:35:57 +0100 |
---|---|---|
committer | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2019-12-19 13:05:09 +0100 |
commit | 79eae96f45dbc953b5bc5512c82f4747c5b69c09 (patch) | |
tree | f6b5be0fdc1e799d8ea1bd55cd69cd8f27a220cf | |
parent | 9e5d6114d54479724bc7552cccd276fc691b1c37 (diff) | |
download | nextcloud-server-79eae96f45dbc953b5bc5512c82f4747c5b69c09.tar.gz nextcloud-server-79eae96f45dbc953b5bc5512c82f4747c5b69c09.zip |
use Nodes API for zip streaming
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
-rw-r--r-- | lib/private/Streamer.php | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/lib/private/Streamer.php b/lib/private/Streamer.php index 549b3a6f485..a25e3468593 100644 --- a/lib/private/Streamer.php +++ b/lib/private/Streamer.php @@ -26,6 +26,12 @@ namespace OC; +use OC\Files\Filesystem; +use OCP\Files\File; +use OCP\Files\Folder; +use OCP\Files\InvalidPathException; +use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; use OCP\IRequest; use ownCloud\TarStreamer\TarStreamer; use ZipStreamer\ZipStreamer; @@ -77,23 +83,25 @@ class Streamer { $this->streamerInstance = new ZipStreamer(['zip64' => PHP_INT_SIZE !== 4]); } } - + /** * Send HTTP headers - * @param string $name + * @param string $name */ public function sendHeaders($name){ $extension = $this->streamerInstance instanceof ZipStreamer ? '.zip' : '.tar'; $fullName = $name . $extension; $this->streamerInstance->sendHeaders($fullName); } - + /** * Stream directory recursively - * @param string $dir - * @param string $internalDir + * + * @throws NotFoundException + * @throws NotPermittedException + * @throws InvalidPathException */ - public function addDirRecursive($dir, $internalDir='') { + public function addDirRecursive(string $dir, string $internalDir = ''): void { $dirname = basename($dir); $rootDir = $internalDir . $dirname; if (!empty($rootDir)) { @@ -103,22 +111,27 @@ class Streamer { // prevent absolute dirs $internalDir = ltrim($internalDir, '/'); - $files= \OC\Files\Filesystem::getDirectoryContent($dir); + $userFolder = \OC::$server->getRootFolder()->get(Filesystem::getRoot()); + /** @var Folder $dirNode */ + $dirNode = $userFolder->get($rootDir); + $files = $dirNode->getDirectoryListing(); + foreach($files as $file) { - $filename = $file['name']; - $file = $dir . '/' . $filename; - if(\OC\Files\Filesystem::is_file($file)) { - $filesize = \OC\Files\Filesystem::filesize($file); - $fileTime = \OC\Files\Filesystem::filemtime($file); - $fh = \OC\Files\Filesystem::fopen($file, 'r'); - $this->addFileFromStream($fh, $internalDir . $filename, $filesize, $fileTime); + if($file instanceof File) { + $fh = $file->fopen('r'); + $this->addFileFromStream( + $fh, + $internalDir . $file->getName(), + $file->getSize(), + $file->getMTime() + ); fclose($fh); - }elseif(\OC\Files\Filesystem::is_dir($file)) { - $this->addDirRecursive($file, $internalDir); + } elseif ($file instanceof Folder) { + $this->addDirRecursive($file->getName(), $internalDir); } } } - + /** * Add a file to the archive at the specified location and file name. * |