use Nodes API for zip streaming

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
Arthur Schiwon 2019-12-12 22:35:57 +01:00
parent 9e5d6114d5
commit 79eae96f45
No known key found for this signature in database
GPG key ID: 7424F1874854DF23

View file

@ -26,6 +26,12 @@
namespace OC; 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 OCP\IRequest;
use ownCloud\TarStreamer\TarStreamer; use ownCloud\TarStreamer\TarStreamer;
use ZipStreamer\ZipStreamer; use ZipStreamer\ZipStreamer;
@ -77,23 +83,25 @@ class Streamer {
$this->streamerInstance = new ZipStreamer(['zip64' => PHP_INT_SIZE !== 4]); $this->streamerInstance = new ZipStreamer(['zip64' => PHP_INT_SIZE !== 4]);
} }
} }
/** /**
* Send HTTP headers * Send HTTP headers
* @param string $name * @param string $name
*/ */
public function sendHeaders($name){ public function sendHeaders($name){
$extension = $this->streamerInstance instanceof ZipStreamer ? '.zip' : '.tar'; $extension = $this->streamerInstance instanceof ZipStreamer ? '.zip' : '.tar';
$fullName = $name . $extension; $fullName = $name . $extension;
$this->streamerInstance->sendHeaders($fullName); $this->streamerInstance->sendHeaders($fullName);
} }
/** /**
* Stream directory recursively * 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); $dirname = basename($dir);
$rootDir = $internalDir . $dirname; $rootDir = $internalDir . $dirname;
if (!empty($rootDir)) { if (!empty($rootDir)) {
@ -103,22 +111,27 @@ class Streamer {
// prevent absolute dirs // prevent absolute dirs
$internalDir = ltrim($internalDir, '/'); $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) { foreach($files as $file) {
$filename = $file['name']; if($file instanceof File) {
$file = $dir . '/' . $filename; $fh = $file->fopen('r');
if(\OC\Files\Filesystem::is_file($file)) { $this->addFileFromStream(
$filesize = \OC\Files\Filesystem::filesize($file); $fh,
$fileTime = \OC\Files\Filesystem::filemtime($file); $internalDir . $file->getName(),
$fh = \OC\Files\Filesystem::fopen($file, 'r'); $file->getSize(),
$this->addFileFromStream($fh, $internalDir . $filename, $filesize, $fileTime); $file->getMTime()
);
fclose($fh); fclose($fh);
}elseif(\OC\Files\Filesystem::is_dir($file)) { } elseif ($file instanceof Folder) {
$this->addDirRecursive($file, $internalDir); $this->addDirRecursive($file->getName(), $internalDir);
} }
} }
} }
/** /**
* Add a file to the archive at the specified location and file name. * Add a file to the archive at the specified location and file name.
* *