From 560af7a5b8e30001ea6bf9a6d2ea36e94ae904d0 Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Tue, 26 Jul 2016 13:17:46 +0200 Subject: allow multiple-file cloud upload --- Zotlabs/Storage/Browser.php | 75 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'Zotlabs/Storage/Browser.php') diff --git a/Zotlabs/Storage/Browser.php b/Zotlabs/Storage/Browser.php index 93c55bd4c..0d1d4e791 100644 --- a/Zotlabs/Storage/Browser.php +++ b/Zotlabs/Storage/Browser.php @@ -69,6 +69,81 @@ class Browser extends DAV\Browser\Plugin { } } + /** + * Extend from parent to add our own listeners + */ + function initialize(DAV\Server $server) { + parent::initialize($server); + if ($this->enablePost) { + $this->server->on('onBrowserPostAction', [$this, 'cloudPostAction']); + } + } + + /** + * Handles POST requests for tree operations. + * + * @param string $uri + * @param string $action + * @param array $postVars + * @return boolean false will stop other events in the beforeMethod chain to execute + */ + function cloudPostAction($uri, $action, $postVars) { + switch ($postVars['sabreAction']) { + case 'mkcol' : + if (isset($postVars['name']) && trim($postVars['name'])) { + // Using basename() because we won't allow slashes + list(, $folderName) = \Sabre\HTTP\URLUtil::splitPath(trim($postVars['name'])); + + if (isset($postVars['resourceType'])) { + $resourceType = explode(',', $postVars['resourceType']); + } else { + $resourceType = ['{DAV:}collection']; + } + + $properties = []; + foreach ($postVars as $varName => $varValue) { + // Any _POST variable in clark notation is treated + // like a property. + if ($varName[0] === '{') { + // PHP will convert any dots to underscores. + // This leaves us with no way to differentiate + // the two. + // Therefore we replace the string *DOT* with a + // real dot. * is not allowed in uris so we + // should be good. + $varName = str_replace('*DOT*', '.', $varName); + $properties[$varName] = $varValue; + } + } + + $mkCol = new DAV\MkCol( + $resourceType, + $properties + ); + $this->server->createCollection($uri . '/' . $folderName, $mkCol); + } + break; + + case 'put' : + + if ($_FILES) + $file = current($_FILES); + else + break; + + for ($i = 0; $i < count($file['name']); $i++) { + list(, $newName) = \Sabre\HTTP\URLUtil::splitPath(trim($file['name'][$i])); + + if (is_uploaded_file($file['tmp_name'][$i])) { + $this->server->createFile($uri . '/' . $newName, fopen($file['tmp_name'][$i], 'r')); + } + } + break; + + } + return false; + } + /** * @brief Creates the directory listing for the given path. * -- cgit v1.2.3