public function testFileSizeNameConversion() { $this->assertEquals(100, Storage::convertFileSizeNameToBytes('100')); $this->assertEquals(100, Storage::convertFileSizeNameToBytes('100b')); $this->assertEquals(102400, Storage::convertFileSizeNameToBytes('100kb')); $this->assertEquals(1024 * 1024, Storage::convertFileSizeNameToBytes('1M')); }
/** * @inheritdoc */ public function exec(Server $server, ConnectionInterface $db, CacheInterface $cache) { $storage = self::loadStorageClass($server); $userFiles = $this->user->meta()->get('files', array()); $method = $server->request()->getMethod(); $fileConf = $server->config('application.files'); $obj = $this->requestedObject(); if ($obj) { $obj = basename($obj); if (basename($this->getPath()) == $obj) { $obj = false; } } if ($method != 'PUT' && $obj && empty($userFiles[$obj])) { return new OperationResponse(404, array('error' => 'file not found')); } if ($method == 'POST') { /* * Create new image versions */ if (empty($_REQUEST['versions'])) { return new OperationResponse(400, array('error' => 'Request parameter "versions" missing')); } else { // Create if (is_array($_REQUEST['versions'])) { $status = 201; // todo: remove old files if version existed before this request $fileName = $userFiles[$obj]['name']; foreach ($_REQUEST['versions'] as $versionName => $versionSize) { if ($versionBaseName = $storage->generateVersion($fileName, $versionSize)) { $userFiles[$obj]['versions'][$versionName] = $versionBaseName; } } } else { $status = 200; $storage->removeVersions($userFiles[$obj]['name'], $userFiles[$obj]['versions']); unset($userFiles[$obj]['versions']); } $this->user->meta()->set('files', $userFiles); $userFactory = new UserFactory($db, $cache); $userFactory->update($this->user); return new OperationResponse($status, $this->addLocation($userFiles[$obj], $fileConf)); } } if ($method == 'GET' || $method == 'DELETE') { /* * Get file info */ if ($obj) { if ($method == 'DELETE') { $file = $userFiles[$obj]; // Remove versions if (!empty($_REQUEST['versions'])) { if (!empty($file['versions'])) { $versionFiles = array(); foreach ($_REQUEST['versions'] as $versionName) { if (isset($file['versions'][$versionName])) { $versionFiles[] = $file['versions'][$versionName]; unset($file['versions'][$versionName]); } } $storage->removeVersions($file['name'], $versionFiles); } $message = 'Version removed'; $userFiles[$obj] = $file; } else { $storage->removeFile($file['name']); unset($userFiles[$obj]); $message = 'File removed'; } $this->user->meta()->set('files', $userFiles); $userFactory = new UserFactory($db, $cache); $userFactory->update($this->user); return new OperationResponse(200, array('message' => $message)); } else { return new OperationResponse(200, $this->addLocation($userFiles[$obj], $fileConf)); } } else { /* * Delete all files */ if ($method == 'DELETE') { self::deleteAllFiles($this->user, new UserFactory($db, $cache), $userFiles, $storage); return new OperationResponse(204); } else { foreach ($userFiles as $name => $fileData) { $userFiles[$name] = $this->addLocation($fileData, $fileConf); } return new OperationResponse(200, $obj); } } } else { if (empty($obj)) { return new OperationResponse(400, array('error' => 'no file given')); } // No php files please... if (strpos(pathinfo($obj, PATHINFO_EXTENSION), 'php') !== false) { $obj = pathinfo($obj, PATHINFO_FILENAME) . '.nfw'; $mime = 'text/plain'; } else { $mime = $server->request()->getContentType(); if (!$mime) { $mime = 'text/plain'; } } // Check that it's not too large $contentLength = $server->request()->getContentLength(); if (!empty($fileConf['max_size']) && Storage::convertFileSizeNameToBytes($fileConf['max_size']) < $contentLength) { return new OperationResponse(413, array('error' => 'File is too large')); } // Store the file $tmpFile = $this->saveRequestBodyToFile($server->request()->getBody(), isset($_GET['base64_decode'])); $newFileName = $this->createFileName($obj); $versions = !empty($_GET['versions']) && is_array($_GET['versions']) ? $_GET['versions'] : array(); $fileData = $storage->storeFile($tmpFile, $newFileName, $mime, $versions); fclose($tmpFile); // Add file data to user meta and update user $userFiles[$obj] = $fileData; $this->user->meta()->set('files', $userFiles); $userFactory = new UserFactory($db, $cache); $userFactory->update($this->user); // Return file info return new OperationResponse(201, $this->addLocation($fileData, $fileConf)); } }