Chunked upload: Refactor OC_FileChunking to object
This commit is contained in:
parent
2d85ef0e04
commit
1ea33ff36b
2 changed files with 35 additions and 21 deletions
|
@ -49,12 +49,13 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
|
|||
*/
|
||||
public function createFile($name, $data = null) {
|
||||
if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
|
||||
OC_FileChunking::store($name, $data);
|
||||
$info = OC_FileChunking::decodeName($name);
|
||||
if (OC_FileChunking::isComplete($info)) {
|
||||
$chunk_handler = new OC_FileChunking($info);
|
||||
$chunk_handler->store($info['index'], $data);
|
||||
if ($chunk_handler->isComplete()) {
|
||||
$newPath = $this->path . '/' . $info['name'];
|
||||
$f = OC_Filesystem::fopen($newPath, 'w');
|
||||
OC_FileChunking::assemble($info, $f);
|
||||
$chunk_handler->assemble($f);
|
||||
return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath);
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -8,42 +8,55 @@
|
|||
|
||||
|
||||
class OC_FileChunking {
|
||||
protected $info;
|
||||
protected $cache;
|
||||
|
||||
static public function decodeName($name) {
|
||||
preg_match('/(?P<name>.*)-chunking-(?P<transferid>\d+)-(?P<chunkcount>\d+)-(?P<index>\d+)/', $name, $matches);
|
||||
return $matches;
|
||||
}
|
||||
|
||||
static public function getPrefix($name, $transferid, $chunkcount) {
|
||||
public function __construct($info) {
|
||||
$this->info = $info;
|
||||
}
|
||||
|
||||
public function getPrefix() {
|
||||
$name = $this->info['name'];
|
||||
$transferid = $this->info['transferid'];
|
||||
$chunkcount = $this->info['chunkcount'];
|
||||
|
||||
return $name.'-chunking-'.$transferid.'-'.$chunkcount.'-';
|
||||
}
|
||||
|
||||
static public function store($name, $data) {
|
||||
$cache = new OC_Cache_File();
|
||||
protected function getCache() {
|
||||
if (!isset($this->cache)) {
|
||||
$this->cache = new OC_Cache_File();
|
||||
}
|
||||
return $this->cache;
|
||||
}
|
||||
|
||||
public function store($index, $data) {
|
||||
$cache = $this->getCache();
|
||||
$name = $this->getPrefix().$index;
|
||||
$cache->set($name, $data);
|
||||
}
|
||||
|
||||
static public function isComplete($info) {
|
||||
$prefix = OC_FileChunking::getPrefix($info['name'],
|
||||
$info['transferid'],
|
||||
$info['chunkcount']
|
||||
);
|
||||
public function isComplete() {
|
||||
$prefix = $this->getPrefix();
|
||||
$parts = 0;
|
||||
$cache = new OC_Cache_File();
|
||||
for($i=0; $i < $info['chunkcount']; $i++) {
|
||||
$cache = $this->getCache();
|
||||
for($i=0; $i < $this->info['chunkcount']; $i++) {
|
||||
if ($cache->hasKey($prefix.$i)) {
|
||||
$parts ++;
|
||||
}
|
||||
}
|
||||
return $parts == $info['chunkcount'];
|
||||
return $parts == $this->info['chunkcount'];
|
||||
}
|
||||
|
||||
static public function assemble($info, $f) {
|
||||
$cache = new OC_Cache_File();
|
||||
$prefix = OC_FileChunking::getPrefix($info['name'],
|
||||
$info['transferid'],
|
||||
$info['chunkcount']
|
||||
);
|
||||
for($i=0; $i < $info['chunkcount']; $i++) {
|
||||
public function assemble($f) {
|
||||
$cache = $this->getCache();
|
||||
$prefix = $this->getPrefix();
|
||||
for($i=0; $i < $this->info['chunkcount']; $i++) {
|
||||
$chunk = $cache->get($prefix.$i);
|
||||
$cache->remove($prefix.$i);
|
||||
fwrite($f,$chunk);
|
||||
|
|
Loading…
Reference in a new issue