diff --git a/lib/private/Streamer.php b/lib/private/Streamer.php
index 7b178fda65293dfa3a7b43448f0f6ea830142fac..3b033e265e76b0ef4ef7ce35058575ba7423c3cc 100644
--- a/lib/private/Streamer.php
+++ b/lib/private/Streamer.php
@@ -24,6 +24,7 @@
 
 namespace OC;
 
+use OCP\IRequest;
 use ownCloud\TarStreamer\TarStreamer;
 use ZipStreamer\ZipStreamer;
 
@@ -33,12 +34,22 @@ class Streamer {
 
 	// streamer instance
 	private $streamerInstance;
-	
-	public function __construct(){
-		/** @var \OCP\IRequest */
-		$request = \OC::$server->getRequest();
-		
-		if ($request->isUserAgent($this->preferTarFor)) {
+
+	/**
+	 * Streamer constructor.
+	 *
+	 * @param IRequest $request
+	 * @param int $size The size of the files in bytes
+	 */
+	public function __construct(IRequest $request, int $size){
+
+		/**
+		 * If the size if below 4GB always use zip32
+		 * Use 4*1000*1000*1000 so we have a buffer for all the extra zip data
+		 */
+		if ($size < 4 * 1000 * 1000 * 1000) {
+			$this->streamerInstance = new ZipStreamer(['zip64' => false]);
+		} else if ($request->isUserAgent($this->preferTarFor)) {
 			$this->streamerInstance = new TarStreamer();
 		} else {
 			$this->streamerInstance = new ZipStreamer(['zip64' => PHP_INT_SIZE !== 4]);
diff --git a/lib/private/legacy/files.php b/lib/private/legacy/files.php
index def9f82fab9dcbdf29254ea8f50f2abadfb0a287..b7c99b7fef8d7d63206a96ce471c59e095c33d59 100644
--- a/lib/private/legacy/files.php
+++ b/lib/private/legacy/files.php
@@ -144,17 +144,28 @@ class OC_Files {
 				}
 			}
 
-			$streamer = new Streamer();
-			OC_Util::obEnd();
-
 			self::lockFiles($view, $dir, $files);
 
+			/* Calculate filesize */
+			if ($getType === self::ZIP_FILES) {
+				$fileSize = 0;
+				foreach ($files as $file) {
+					$fileSize += \OC\Files\Filesystem::getFileInfo($dir . '/' . $file)->getSize();
+				}
+			} elseif ($getType === self::ZIP_DIR) {
+				$fileSize = \OC\Files\Filesystem::getFileInfo($dir . '/' . $files)->getSize();
+			}
+
+			$streamer = new Streamer(\OC::$server->getRequest(), $fileSize);
+			OC_Util::obEnd();
+
 			$streamer->sendHeaders($name);
 			$executionTime = (int)OC::$server->getIniWrapper()->getNumeric('max_execution_time');
 			if (strpos(@ini_get('disable_functions'), 'set_time_limit') === false) {
 				@set_time_limit(0);
 			}
 			ignore_user_abort(true);
+
 			if ($getType === self::ZIP_FILES) {
 				foreach ($files as $file) {
 					$file = $dir . '/' . $file;