]> source.dussan.org Git - nextcloud-server.git/commitdiff
Chunked upload: Refactor to static class
authorBart Visscher <bartv@thisnet.nl>
Fri, 27 Jul 2012 09:59:52 +0000 (11:59 +0200)
committerBart Visscher <bartv@thisnet.nl>
Fri, 27 Jul 2012 17:32:44 +0000 (19:32 +0200)
lib/connector/sabre/directory.php
lib/filechunking.php [new file with mode: 0644]

index bed75015aef8216e35593e7fb4caf13ff554dc59..b88d0f32864989678cac795bb724b029dd02c54a 100644 (file)
@@ -49,25 +49,12 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
         */
        public function createFile($name, $data = null) {
                if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
-                       $cache = new OC_Cache_File();
-                       $cache->set($name, $data);
-                       preg_match('/(?P<name>.*)-chunking-(?P<transferid>\d+)-(?P<chunkcount>\d+)-(?P<index>\d+)/', $name, $matches);
-                       $prefix = $matches['name'].'-chunking-'.$matches['transferid'].'-'.$matches['chunkcount'].'-';
-                       $parts = 0;
-                       for($i=0; $i < $matches['chunkcount']; $i++) {
-                               if ($cache->hasKey($prefix.$i)) {
-                                       $parts ++;
-                               }
-                       }
-                       if ($parts == $matches['chunkcount']) {
-                               $newPath = $this->path . '/' . $matches['name'];
+                       OC_FileChunking::store($name, $data);
+                       $info = OC_FileChunking::decodeName($name);
+                       if (OC_FileChunking::isComplete($info)) {
+                               $newPath = $this->path . '/' . $info['name'];
                                $f = OC_Filesystem::fopen($newPath, 'w');
-                               for($i=0; $i < $matches['chunkcount']; $i++) {
-                                       $chunk = $cache->get($prefix.$i);
-                                       $cache->remove($prefix.$i);
-                                       fwrite($f,$chunk);
-                               }
-                               fclose($f);
+                               OC_FileChunking::assemble($info, $f);
                                return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath);
                        }
                } else {
diff --git a/lib/filechunking.php b/lib/filechunking.php
new file mode 100644 (file)
index 0000000..4e4918d
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+
+class OC_FileChunking {
+       static public function decodeName($name) {
+               preg_match('/(?P<name>.*)-chunking-(?P<transferid>\d+)-(?P<chunkcount>\d+)-(?P<index>\d+)/', $name, $matches);
+               return $matches;
+       }
+
+       static public function getPrefix($name, $transferid, $chunkcount) {
+               return $name.'-chunking-'.$transferid.'-'.$chunkcount.'-';
+       }
+
+       static public function store($name, $data) {
+               $cache = new OC_Cache_File();
+               $cache->set($name, $data);
+       }
+
+       static public function isComplete($info) {
+               $prefix = OC_FileChunking::getPrefix($info['name'],
+                               $info['transferid'],
+                               $info['chunkcount']
+                       );
+               $parts = 0;
+               $cache = new OC_Cache_File();
+               for($i=0; $i < $info['chunkcount']; $i++) {
+                       if ($cache->hasKey($prefix.$i)) {
+                               $parts ++;
+                       }
+               }
+               return $parts == $info['chunkcount'];
+       }
+
+       static public function assemble($info, $f) {
+               $cache = new OC_Cache_File();
+               $prefix = OC_FileChunking::getPrefix($info['name'],
+                               $info['transferid'],
+                               $info['chunkcount']
+                       );
+               for($i=0; $i < $info['chunkcount']; $i++) {
+                       $chunk = $cache->get($prefix.$i);
+                       $cache->remove($prefix.$i);
+                       fwrite($f,$chunk);
+               }
+               fclose($f);
+       }
+}