diff options
author | Vincent Petry <pvince81@owncloud.com> | 2014-03-12 16:57:39 +0100 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2014-03-17 13:04:34 +0100 |
commit | 4033eba374cde80751c393e1f6ed5c647661f4c8 (patch) | |
tree | bae614d3ec1035a5d7d22ecf8c3a3ebe49abdb83 /lib/private/filechunking.php | |
parent | bd98538a3646e4f7a56a16e93889e4d3079501d6 (diff) | |
download | nextcloud-server-4033eba374cde80751c393e1f6ed5c647661f4c8.tar.gz nextcloud-server-4033eba374cde80751c393e1f6ed5c647661f4c8.zip |
Fixed chunking and insufficient storage check
- fixed free space detection based on the already uploaded chunks
- now deleting chunks as soon as it is read out before writing it into
the part file, which reduces the space needed when assembling part
files
Diffstat (limited to 'lib/private/filechunking.php')
-rw-r--r-- | lib/private/filechunking.php | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/lib/private/filechunking.php b/lib/private/filechunking.php index be7f4e14a11..1da02fc81e3 100644 --- a/lib/private/filechunking.php +++ b/lib/private/filechunking.php @@ -64,20 +64,46 @@ class OC_FileChunking { return $parts == $this->info['chunkcount']; } + /** + * Assembles the chunks into the file specified by the path. + * Chunks are deleted afterwards. + * + * @param string $f target path + * + * @return assembled file size + * + * @throws \OC\InsufficientStorageException when file could not be fully + * assembled due to lack of free space + */ public function assemble($f) { $cache = $this->getCache(); $prefix = $this->getPrefix(); $count = 0; - for($i=0; $i < $this->info['chunkcount']; $i++) { + for ($i = 0; $i < $this->info['chunkcount']; $i++) { $chunk = $cache->get($prefix.$i); + // remove after reading to directly save space + $cache->remove($prefix.$i); $count += fwrite($f, $chunk); } - $this->cleanup(); return $count; } /** + * Returns the size of the chunks already present + * @return size in bytes + */ + public function getCurrentSize() { + $cache = $this->getCache(); + $prefix = $this->getPrefix(); + $total = 0; + for ($i = 0; $i < $this->info['chunkcount']; $i++) { + $total += $cache->size($prefix.$i); + } + return $total; + } + + /** * Removes all chunks which belong to this transmission */ public function cleanup() { @@ -128,7 +154,15 @@ class OC_FileChunking { } /** - * @param string $path + * Assembles the chunks into the file specified by the path. + * Also triggers the relevant hooks and proxies. + * + * @param string $path target path + * + * @return assembled file size or false if file could not be created + * + * @throws \OC\InsufficientStorageException when file could not be fully + * assembled due to lack of free space */ public function file_assemble($path) { $absolutePath = \OC\Files\Filesystem::normalizePath(\OC\Files\Filesystem::getView()->getAbsolutePath($path)); |