Exemple #1
0
 /**
  * Upload a file.
  */
 public function actionUpload()
 {
     if (isset($_FILES['upload'])) {
         if (isset($_POST['drive']) && $_POST['drive']) {
             // google drive
             $auth = new GoogleAuthenticator();
             if ($auth->getAccessToken()) {
                 $service = $auth->getDriveService();
             }
             $createdFile = null;
             if (isset($service, $_SESSION['access_token'], $_FILES['upload'])) {
                 try {
                     $file = new Google_DriveFile();
                     $file->setTitle($_FILES['upload']['name']);
                     $file->setDescription('Uploaded by X2Engine');
                     $file->setMimeType($_FILES['upload']['type']);
                     if (empty($_FILES['upload']['tmp_name'])) {
                         $err = false;
                         switch ($_FILES['newfile']['error']) {
                             case UPLOAD_ERR_INI_SIZE:
                             case UPLOAD_ERR_FORM_SIZE:
                                 $err .= 'File size exceeds limit of ' . get_max_upload() . ' bytes.';
                                 break;
                             case UPLOAD_ERR_PARTIAL:
                                 $err .= 'File upload was not completed.';
                                 break;
                             case UPLOAD_ERR_NO_FILE:
                                 $err .= 'Zero-length file uploaded.';
                                 break;
                             default:
                                 $err .= 'Internal error ' . $_FILES['newfile']['error'];
                                 break;
                         }
                         if ((bool) $message) {
                             throw new CException($message);
                         }
                     }
                     $data = file_get_contents($_FILES['upload']['tmp_name']);
                     $createdFile = $service->files->insert($file, array('data' => $data, 'mimeType' => $_FILES['upload']['type']));
                     if (is_array($createdFile)) {
                         $model = new Media();
                         $model->fileName = $createdFile['id'];
                         $model->name = $createdFile['title'];
                         if (isset($_POST['associationId'])) {
                             $model->associationId = $_POST['associationId'];
                         }
                         if (isset($_POST['associationType'])) {
                             $model->associationType = $_POST['associationType'];
                         }
                         if (isset($_POST['private'])) {
                             $model->private = $_POST['private'];
                         }
                         $model->uploadedBy = Yii::app()->user->getName();
                         $model->mimetype = $createdFile['mimeType'];
                         $model->filesize = $createdFile['fileSize'];
                         $model->drive = 1;
                         $model->save();
                         if ($model->associationType == 'feed') {
                             $event = new Events();
                             $event->user = Yii::app()->user->getName();
                             if (isset($_POST['attachmentText']) && !empty($_POST['attachmentText'])) {
                                 $event->text = $_POST['attachmentText'];
                             } else {
                                 $event->text = Yii::t('app', 'Attached file: ');
                             }
                             $event->type = 'media';
                             $event->timestamp = time();
                             $event->lastUpdated = time();
                             $event->associationId = $model->id;
                             $event->associationType = 'Media';
                             $event->save();
                             $this->redirect(array('/profile/view', 'id' => Yii::app()->user->getId()));
                         } elseif ($model->associationType == 'docs') {
                             $this->redirect(array('/docs/docs/index'));
                         } elseif (!empty($model->associationType) && !empty($model->associationId)) {
                             $note = new Actions();
                             $note->createDate = time();
                             $note->dueDate = time();
                             $note->completeDate = time();
                             $note->complete = 'Yes';
                             $note->visibility = '1';
                             $note->completedBy = Yii::app()->user->getName();
                             if ($model->private) {
                                 $note->assignedTo = Yii::app()->user->getName();
                                 $note->visibility = '0';
                             } else {
                                 $note->assignedTo = 'Anyone';
                             }
                             $note->type = 'attachment';
                             $note->associationId = $_POST['associationId'];
                             $note->associationType = $_POST['associationType'];
                             $association = $this->getAssociation($note->associationType, $note->associationId);
                             if ($association != null) {
                                 $note->associationName = $association->name;
                             }
                             $note->actionDescription = $model->fileName . ':' . $model->id;
                             if ($note->save()) {
                                 $this->redirect(array($model->associationType . '/' . $model->associationId));
                             }
                         } else {
                             $this->redirect('/media/media/view', array('id' => $model->id));
                         }
                     } else {
                         throw new CHttpException('400', 'Invalid request.');
                     }
                 } catch (Google_AuthException $e) {
                     $auth->flushCredentials();
                     $auth->setErrors($e->getMessage());
                     $service = null;
                     $createdFile = null;
                 }
             } else {
                 if (isset($_SERVER['HTTP_REFERER'])) {
                     $this->redirect($_SERVER['HTTP_REFERER']);
                 } else {
                     throw new CHttpException('400', 'Invalid request');
                 }
             }
         } else {
             // non-google drive upload
             $model = new Media();
             $temp = CUploadedFile::getInstanceByName('upload');
             // file uploaded through form
             $tempName = $temp->getTempName();
             if (isset($temp) && !empty($tempName)) {
                 $name = $temp->getName();
                 $name = str_replace(' ', '_', $name);
                 $check = Media::model()->findAllByAttributes(array('fileName' => $name));
                 // rename file if there name conflicts by suffixing "(n)"
                 if (count($check) != 0) {
                     $count = 1;
                     $newName = $name;
                     $arr = explode('.', $name);
                     $name = $arr[0];
                     while (count($check) != 0) {
                         $newName = $name . '(' . $count . ').' . $temp->getExtensionName();
                         $check = Media::model()->findAllByAttributes(array('fileName' => $newName));
                         $count++;
                     }
                     $name = $newName;
                 }
                 $username = Yii::app()->user->name;
                 // copy file to user's media uploads directory
                 if (FileUtil::ccopy($tempName, "uploads/media/{$username}/{$name}")) {
                     if (isset($_POST['associationId'])) {
                         $model->associationId = $_POST['associationId'];
                     }
                     if (isset($_POST['associationType'])) {
                         $model->associationType = $_POST['associationType'];
                     }
                     if (isset($_POST['private'])) {
                         $model->private = $_POST['private'];
                     }
                     $model->uploadedBy = Yii::app()->user->getName();
                     $model->createDate = time();
                     $model->lastUpdated = time();
                     $model->fileName = $name;
                     if (!$model->save()) {
                         $errors = $model->getErrors();
                         $error = ArrayUtil::pop(ArrayUtil::pop($errors));
                         Yii::app()->user->setFlash('top-error', Yii::t('app', 'Attachment failed. ' . $error));
                         $this->redirect(array($model->associationType . '/' . $model->associationType . '/view', 'id' => $model->associationId));
                         Yii::app()->end();
                     }
                     // handle different upload types
                     switch ($model->associationType) {
                         case 'feed':
                             $this->handleFeedTypeUpload($model, $name);
                             break;
                         case 'docs':
                             $this->redirect(array('/docs/docs/index'));
                             break;
                         case 'loginSound':
                         case 'notificationSound':
                             $this->redirect(array('/profile/settings', 'id' => Yii::app()->user->getId()));
                             break;
                         case 'bg':
                         case 'bg-private':
                             $this->redirect(array('/profile/settings', 'id' => Yii::app()->user->getId(), 'bgId' => $model->id));
                             break;
                         default:
                             $this->handleDefaultUpload($model, $name);
                             break;
                     }
                 }
             } else {
                 if (isset($_SERVER['HTTP_REFERER'])) {
                     $this->redirect($_SERVER['HTTP_REFERER']);
                 } else {
                     throw new CHttpException('400', 'Invalid request');
                 }
             }
         }
     } else {
         throw new CHttpException('400', 'Invalid request.');
     }
 }
Exemple #2
0
 public function printFolder($folderId, $auth = null)
 {
     if (is_null($auth)) {
         $auth = new GoogleAuthenticator();
     }
     $service = $auth->getDriveService();
     try {
         if ($service) {
             $ret = "";
             $files = $service->files;
             $fileList = $files->listFiles(array('q' => 'trashed=false and "' . $folderId . '" in parents'));
             $folderList = array();
             $fileArray = array();
             foreach ($fileList['items'] as $file) {
                 if ($file['mimeType'] == 'application/vnd.google-apps.folder') {
                     $folderList[] = $file;
                 } else {
                     $fileArray[] = $file;
                 }
             }
             $fileList = array_merge($folderList, $fileArray);
             foreach ($fileList as $file) {
                 if ($file['mimeType'] == 'application/vnd.google-apps.folder') {
                     $ret .= "<div class='drive-wrapper'><div class='drive-item'><div class='drive-icon' style='background:url(\"" . $file['iconLink'] . "\") no-repeat'></div><a href='#' class='toggle-file-system drive-link' data-id='{$file['id']}'> " . $file['title'] . "</a></div></div>";
                     $ret .= "<div class='drive' id='{$file['id']}' style='display:none;'>";
                     $ret .= "</div>";
                 } else {
                     $ret .= "<div class='drive-wrapper'><div class='drive-item'><div class='drive-icon' style='background:url(\"" . $file['iconLink'] . "\") no-repeat'></div> <a class='x2-link drive-link media' href='" . $file['alternateLink'] . "' target='_blank'>" . $file['title'] . "</a></div></div>";
                 }
             }
             return $ret;
         } else {
             return false;
         }
     } catch (Google_AuthException $e) {
         if (isset($_SESSION['access_token']) || isset($_SESSION['token'])) {
             // If these are set it's possible the token expired and there is a refresh token available
             $auth->flushCredentials(false);
             // Only flush the recently received information
             return $this->printFolder($folderId);
             // Try again, it will use a refresh token if available this time, otherwise it will fail.
         } else {
             $auth->flushCredentials();
             $auth->setErrors($e->getMessage());
             return false;
         }
     } catch (Google_ServiceException $e) {
         $auth->setErrors($e->getMessage());
         return false;
     }
 }