]> source.dussan.org Git - nextcloud-server.git/commitdiff
use streams instead of temporary files for cross-storage copy and rename
authorRobin Appelman <icewind@owncloud.com>
Sun, 5 Feb 2012 19:49:32 +0000 (20:49 +0100)
committerRobin Appelman <icewind@owncloud.com>
Tue, 21 Feb 2012 19:48:48 +0000 (20:48 +0100)
lib/filesystemview.php

index a78f3f652ade49b1375df94d5dec36096c2b1ef8..27552d25f2bb1b6176bb4ccb9002b6d48751cdf7 100644 (file)
@@ -179,9 +179,13 @@ class OC_FilesystemView {
                                        if($storage=$this->getStorage($path1)){
                                                $result=$storage->rename($this->getInternalPath($path1),$this->getInternalPath($path2));
                                        }
-                               }elseif($storage1=$this->getStorage($path1) and $storage2=$this->getStorage($path2)){
-                                       $tmpFile=$storage1->toTmpFile($this->getInternalPath($path1));
-                                       $result=$storage2->fromTmpFile($tmpFile,$this->getInternalPath($path2));
+                               }else{
+                                       $source=$this->fopen($path1,'r');
+                                       $target=$this->fopen($path2,'w');
+                                       while (!feof($source)){
+                                               fwrite($target,fread($source,8192));
+                                       }
+                                       $storage1=$this->getStorage($path1);
                                        $storage1->unlink($this->getInternalPath($path1));
                                }
                                OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_rename, array( OC_Filesystem::signal_param_oldpath => $path1, OC_Filesystem::signal_param_newpath=>$path2));
@@ -207,9 +211,14 @@ class OC_FilesystemView {
                                        if($storage=$this->getStorage($path1)){
                                                $result=$storage->copy($this->getInternalPath($path1),$this->getInternalPath($path2));
                                        }
-                               }elseif($storage1=$this->getStorage($path1) and $storage2=$this->getStorage($path2)){
-                                       $tmpFile=$storage1->toTmpFile($this->getInternalPath($path1));
-                                       $result=$storage2->fromTmpFile($tmpFile,$this->getInternalPath($path2));
+                               }else{
+                                       $source=$this->fopen($path1,'r');
+                                       $target=$this->fopen($path2,'w');
+                                       if($target and $source){
+                                               while (!feof($source)){
+                                                       fwrite($target,fread($source,8192));
+                                               }
+                                       }
                                }
         OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_copy, array( OC_Filesystem::signal_param_oldpath => $path1 , OC_Filesystem::signal_param_newpath=>$path2));
                                if(!$exists){