diff --git a/lib/connector/sabre/directory.php b/lib/connector/sabre/directory.php index bed75015ae..b88d0f3286 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.*)-chunking-(?P\d+)-(?P\d+)-(?P\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 0000000000..4e4918d49d --- /dev/null +++ b/lib/filechunking.php @@ -0,0 +1,53 @@ + + * 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.*)-chunking-(?P\d+)-(?P\d+)-(?P\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); + } +}