]> source.dussan.org Git - nextcloud-server.git/commitdiff
Merge branch 'master' into chunked_upload
authorBart Visscher <bartv@thisnet.nl>
Fri, 27 Jul 2012 09:40:51 +0000 (11:40 +0200)
committerBart Visscher <bartv@thisnet.nl>
Fri, 27 Jul 2012 09:40:51 +0000 (11:40 +0200)
Conflicts:
lib/connector/sabre/directory.php

1  2 
lib/connector/sabre/directory.php

index 894256d5b2af03fdec0939bb04898a2117e1e397,7f8434c71512256aa911d2d553e0b7a3331f9ea2..bed75015aef8216e35593e7fb4caf13ff554dc59
@@@ -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) {
 -              $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;
        }
  
        /**