From: Bart Visscher Date: Fri, 27 Jul 2012 09:40:51 +0000 (+0200) Subject: Merge branch 'master' into chunked_upload X-Git-Tag: v4.5.0beta1~74^2~225^2~3 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a7a54331082c41c5b05cd7982c058caf1556f777;p=nextcloud-server.git Merge branch 'master' into chunked_upload Conflicts: lib/connector/sabre/directory.php --- a7a54331082c41c5b05cd7982c058caf1556f777 diff --cc lib/connector/sabre/directory.php index 894256d5b2a,7f8434c7151..bed75015aef --- a/lib/connector/sabre/directory.php +++ b/lib/connector/sabre/directory.php @@@ -26,38 -26,33 +26,57 @@@ class OC_Connector_Sabre_Directory exte /** * Creates a new file in the directory * - * data is a readable stream resource + * Data will either be supplied as a stream resource, or in certain cases + * as a string. Keep in mind that you may have to support either. + * + * After succesful creation of the file, you may choose to return the ETag + * of the new file here. + * + * The returned ETag must be surrounded by double-quotes (The quotes should + * be part of the actual string). + * + * If you cannot accurately determine the ETag, you should not return it. + * If you don't store the file exactly as-is (you're transforming it + * somehow) you should also not return an ETag. + * + * This means that if a subsequent GET to this new file does not exactly + * return the same contents of what was submitted here, you are strongly + * recommended to omit the ETag. * * @param string $name Name of the file - * @param resource $data Initial payload - * @return void + * @param resource|string $data Initial payload + * @return null|string */ 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']; + $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); ++ return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath); + } + } else { + $newPath = $this->path . '/' . $name; + OC_Filesystem::file_put_contents($newPath,$data); ++ return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath); + } + - $newPath = $this->path . '/' . $name; - OC_Filesystem::file_put_contents($newPath,$data); - - return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath); ++ return null; } /**