Merge pull request #7696 from owncloud/chunk-remainingspacefix
Fixed chunking and insufficient storage check
This commit is contained in:
commit
6e6a131b32
|
@ -56,8 +56,19 @@ class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin {
|
||||||
$uri='/'.$uri;
|
$uri='/'.$uri;
|
||||||
}
|
}
|
||||||
list($parentUri, $newName) = Sabre_DAV_URLUtil::splitPath($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);
|
$freeSpace = $this->getFreeSpace($parentUri);
|
||||||
if ($freeSpace !== \OC\Files\SPACE_UNKNOWN && $length > $freeSpace) {
|
if ($freeSpace !== \OC\Files\SPACE_UNKNOWN && $length > $freeSpace) {
|
||||||
|
if (isset($chunkHandler)) {
|
||||||
|
$chunkHandler->cleanup();
|
||||||
|
}
|
||||||
throw new Sabre_DAV_Exception_InsufficientStorage();
|
throw new Sabre_DAV_Exception_InsufficientStorage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,19 +64,45 @@ class OC_FileChunking {
|
||||||
return $parts == $this->info['chunkcount'];
|
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) {
|
public function assemble($f) {
|
||||||
$cache = $this->getCache();
|
$cache = $this->getCache();
|
||||||
$prefix = $this->getPrefix();
|
$prefix = $this->getPrefix();
|
||||||
$count = 0;
|
$count = 0;
|
||||||
for($i=0; $i < $this->info['chunkcount']; $i++) {
|
for ($i = 0; $i < $this->info['chunkcount']; $i++) {
|
||||||
$chunk = $cache->get($prefix.$i);
|
$chunk = $cache->get($prefix.$i);
|
||||||
|
// remove after reading to directly save space
|
||||||
|
$cache->remove($prefix.$i);
|
||||||
$count += fwrite($f, $chunk);
|
$count += fwrite($f, $chunk);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->cleanup();
|
|
||||||
return $count;
|
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
|
* 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) {
|
public function file_assemble($path) {
|
||||||
$absolutePath = \OC\Files\Filesystem::normalizePath(\OC\Files\Filesystem::getView()->getAbsolutePath($path));
|
$absolutePath = \OC\Files\Filesystem::normalizePath(\OC\Files\Filesystem::getView()->getAbsolutePath($path));
|
||||||
|
|
Loading…
Reference in New Issue