Esempio n. 1
0
 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'));
 }
Esempio n. 2
0
 /**
  * @inheritdoc
  */
 function storeFile($file, $name, $mime, array $versions = array())
 {
     $location = $this->putFileOnAmazon($file, $name, $mime);
     $fileData = array('location' => $location, 'size' => $this->getRemoteFileSize($location), 'name' => $name, 'extension' => pathinfo($name, PATHINFO_EXTENSION), 'mime' => $mime);
     $versionData = null;
     if (Storage::isImage($fileData['extension'])) {
         $tmpFile = tempnam(sys_get_temp_dir(), (string) time());
         if (is_resource($file)) {
             rewind($file);
             $content = stream_get_contents($file);
         } else {
             $content = file_get_contents($file);
         }
         file_put_contents($tmpFile, $content);
         $data = @getimagesize($tmpFile);
         if (!$data) {
             throw new \Exception('Unable to analyze image with getimagesize()');
         }
         $fileData['width'] = $data[0];
         $fileData['height'] = $data[1];
         $versionData = $this->generateImageVersions($versions, $fileData['extension'], $fileData['size'], $tmpFile, basename($name));
         $tmpDir = dirname($tmpFile);
         $fileDir = dirname($name);
         if (is_array($versionData)) {
             foreach ($versionData as $name => $fileName) {
                 $this->putFileOnAmazon($tmpDir . '/' . $fileName, $fileDir . '/' . $fileName, $mime);
             }
         }
     }
     if (!empty($versionData)) {
         $fileData['versions'] = $versionData;
     }
     if (empty($data['mime'])) {
         $data['mime'] = 'text/plain';
     }
     return $fileData;
 }
Esempio n. 3
0
 /**
  * @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));
     }
 }