/**
* 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) {
- $newPath = $this->path . '/' . $name;
- OC_Filesystem::file_put_contents($newPath,$data);
-
- return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath);
+ 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'];
+ $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);
+ }
+
++ return null;
}
/**