Merge pull request #7696 from owncloud/chunk-remainingspacefix
Fixed chunking and insufficient storage check
This commit is contained in:
commit
6e6a131b32
2 changed files with 48 additions and 3 deletions
|
@ -56,8 +56,19 @@ class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin {
|
|||
$uri='/'.$uri;
|
||||
}
|
||||
list($parentUri, $newName) = Sabre_DAV_URLUtil::splitPath($uri);
|
||||
$req = $this->server->httpRequest;
|
||||
if ($req->getHeader('OC-Chunked')) {
|
||||
$info = OC_FileChunking::decodeName($newName);
|
||||
$chunkHandler = new OC_FileChunking($info);
|
||||
// substract the already uploaded size to see whether
|
||||
// there is still enough space for the remaining chunks
|
||||
$length -= $chunkHandler->getCurrentSize();
|
||||
}
|
||||
$freeSpace = $this->getFreeSpace($parentUri);
|
||||
if ($freeSpace !== \OC\Files\SPACE_UNKNOWN && $length > $freeSpace) {
|
||||
if (isset($chunkHandler)) {
|
||||
$chunkHandler->cleanup();
|
||||
}
|
||||
throw new Sabre_DAV_Exception_InsufficientStorage();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,19 +64,45 @@ 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
|
||||
*/
|
||||
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue