aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBart Visscher <bartv@thisnet.nl>2012-07-27 11:59:52 +0200
committerBart Visscher <bartv@thisnet.nl>2012-07-27 19:32:44 +0200
commit2d85ef0e045380691b1dcf136b4b61b46104c2c6 (patch)
treedc49d27b134334b345e5d742469129a94ab41d0c /lib
parenta7a54331082c41c5b05cd7982c058caf1556f777 (diff)
downloadnextcloud-server-2d85ef0e045380691b1dcf136b4b61b46104c2c6.tar.gz
nextcloud-server-2d85ef0e045380691b1dcf136b4b61b46104c2c6.zip
Chunked upload: Refactor to static class
Diffstat (limited to 'lib')
-rw-r--r--lib/connector/sabre/directory.php23
-rw-r--r--lib/filechunking.php53
2 files changed, 58 insertions, 18 deletions
diff --git a/lib/connector/sabre/directory.php b/lib/connector/sabre/directory.php
index bed75015aef..b88d0f32864 100644
--- a/lib/connector/sabre/directory.php
+++ b/lib/connector/sabre/directory.php
@@ -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
index 00000000000..4e4918d49d4
--- /dev/null
+++ b/lib/filechunking.php
@@ -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);
+ }
+}