diff options
author | Bart Visscher <bartv@thisnet.nl> | 2012-07-27 19:02:23 +0200 |
---|---|---|
committer | Bart Visscher <bartv@thisnet.nl> | 2012-07-27 19:35:33 +0200 |
commit | 896d27de36dd26515f30fa3b0748c9c6089600af (patch) | |
tree | 93aab8d29799875faf98f244ddcca77155e0012b /apps/files/appinfo/filesync.php | |
parent | 1ea33ff36bf70ee2099f8d225f488dc220e3bcff (diff) | |
download | nextcloud-server-896d27de36dd26515f30fa3b0748c9c6089600af.tar.gz nextcloud-server-896d27de36dd26515f30fa3b0748c9c6089600af.zip |
Chunked upload: Support reusing local chunks
Diffstat (limited to 'apps/files/appinfo/filesync.php')
-rw-r--r-- | apps/files/appinfo/filesync.php | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/apps/files/appinfo/filesync.php b/apps/files/appinfo/filesync.php new file mode 100644 index 00000000000..707ee2435c0 --- /dev/null +++ b/apps/files/appinfo/filesync.php @@ -0,0 +1,64 @@ +<?php +/** + * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +/** + * filesync can be called with a PUT method. + * PUT takes a stream starting with a 2 byte blocksize, + * followed by binary md5 of the blocks. Everything in big-endian. + * The return is a json encoded with: + * - 'transferid' + * - 'needed' chunks + * - 'last' checked chunk + * The URL is made of 3 parts, the service url (remote.php/filesync/), the sync + * type and the path in ownCloud. + * At the moment the only supported sync type is 'oc_chunked'. + * The final URL will look like http://.../remote.php/filesync/oc_chunked/path/to/file + */ + +// only need filesystem apps +$RUNTIME_APPTYPES=array('filesystem','authentication'); +OC_App::loadApps($RUNTIME_APPTYPES); +if(!OC_User::isLoggedIn()){ + if(!isset($_SERVER['PHP_AUTH_USER'])){ + header('WWW-Authenticate: Basic realm="ownCloud Server"'); + header('HTTP/1.0 401 Unauthorized'); + echo 'Valid credentials must be supplied'; + exit(); + } else { + if(!OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])){ + exit(); + } + } +} + +list($type,$file) = explode('/', substr($path_info,1+strlen($service)+1), 2); + +if ($type != 'oc_chunked') { + OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); + die; +} + +if (!OC_Filesystem::is_file($file)) { + OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); + die; +} + +switch($_SERVER['REQUEST_METHOD']) { + case 'PUT': + $input = fopen("php://input", "r"); + $org_file = OC_Filesystem::fopen($file, 'rb'); + $info = array( + 'name' => basename($file), + ); + $sync = new OC_FileChunking($info); + $result = $sync->signature_split($org_file, $input); + echo json_encode($result); + break; + default: + OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); +} |