Example #1
0
 /**
  * 静态方法, 单例统一访问入口
  * @return object  返回对象的唯一实例
  */
 public static function getInstance()
 {
     if (is_null(self::$_instance) || !isset(self::$_instance)) {
         self::$_instance = new self();
     }
     return self::$_instance;
 }
Example #2
0
 /**
  * 形成最终第三方所需数据
  */
 public function generateFileData($appKey, $session, $linkType)
 {
     //todo appKey检测
     if ($linkType != MiniLink::$DIRECT_LINK) {
         $linkType = MiniLink::$PREVIEW_LINK;
     }
     $links = MiniChooserLink::getInstance()->getBySession($session);
     foreach ($links as $link) {
         $files = MiniLink::getInstance()->getById($link['link_id']);
         $fileId = $files['file_id'];
         $shareKey = $files['share_key'];
         $fileInfo = $this->getLink($fileId, $linkType, $shareKey);
         $filesInfo['list'][] = $fileInfo;
     }
     $filesInfo['success'] = true;
     if ($filesInfo['list'] == null) {
         $filesInfo['success'] = false;
     }
     return $filesInfo;
 }
Example #3
0
 /**
  * 分享用户指定分享
  * @param $userNames
  * @return bool
  */
 public function sendToTransfer($userNames)
 {
     $link = MiniLink::getInstance()->getByKey($this->key);
     if ($link === NULL) {
         return;
     }
     $file = MiniFile::getInstance()->getById($link["file_id"]);
     if ($file === NULL) {
         return;
     }
     $deviceId = $this->device["id"];
     if (count($userNames) > 0) {
         foreach ($userNames as $name) {
             $user = MiniUser::getInstance()->getUserByName($name);
             if ($user === NULL) {
                 continue;
             }
             MiniFile::getInstance()->copy($file["id"], $user['id'], $deviceId, 0);
         }
         return true;
     }
     return false;
 }
Example #4
0
 /**
  * 删除文件
  * @param int $id
  * @return bool
  */
 public function deleteFile($id)
 {
     $model = $this->getModelById($id);
     if (isset($model)) {
         $file = $this->db2Item($model);
         //删除FileMeta
         MiniFileMeta::getInstance()->cleanFileMetaByPath($file["file_path"]);
         //删除tag数据
         MiniTag::getInstance()->deleteByFileId($id);
         //Version数据减一
         $versionId = $file["version_id"];
         MiniVersion::getInstance()->updateRefCountByIds(array($versionId), false);
         //删除share_files
         MiniLink::getInstance()->unlink($id);
         //删除user_privilege
         MiniUserPrivilege::getInstance()->deleteByFilePath($file["file_path"]);
         //删除自己
         $model->delete();
     }
     return true;
 }
Example #5
0
 /**
  * 检查密码
  * @return mixed
  */
 public function checkPassword()
 {
     $key = MiniHttp::getParam("key", "");
     $password = MiniHttp::getParam("password", "");
     $result = MiniLink::getInstance()->checkPassword($key, $password);
     return $result;
 }
Example #6
0
 /**
  * 彻底删除文件
  * 根据{id}递归删除自目录
  * 根据{id}找出文件的{version_id},把文件引用数减1
  * 根據{id}删除fileMeta
  * 根据{id}删除file
  * @param $fileIds
  * @param $force
  * @return boolean
  */
 public function deletedFile($fileIds, $force = false)
 {
     if ($fileIds === '' && strlen($fileIds) <= 0) {
         return 0;
     }
     $ids = '';
     $arr = array();
     $data = $this->findAll("id in(" . $fileIds . ")");
     $list = array();
     $device_id = Yii::app()->session["deviceId"];
     foreach ($data as $key => $value) {
         //
         // 递归删除所有子文件
         //
         $moreData = $this->findAll("user_id=:type1 and file_path like :type2", array('type1' => $value['user_id'], 'type2' => $value['file_path'] . "%"));
         foreach ($moreData as $k => $v) {
             if ($v['is_deleted'] == 0 || $v['is_deleted'] == -1) {
                 $user_id = $v['user_id'];
                 $path = $v['file_path'];
                 $context = $path;
                 $event_uuid = MiniUtil::getEventRandomString(46);
                 $action = 1;
                 // 修改文件
                 $share_filter = MSharesFilter::init();
                 $share_filter->handlerCheckByFile($user_id, $v);
                 if ($v['file_type'] == 0) {
                     //
                     // 如果是文件,需要创建版本
                     //
                     $user = Yii::app()->session['user'];
                     $device = UserDevice::model()->findByUserIdAndType($user['id'], CConst::DEVICE_WEB);
                     $deviceName = $device["user_device_name"];
                     $this->_saveFileMeta($path, $v['version_id'], $user['id'], $user['name'], CConst::DELETE, $deviceName, $v['file_size']);
                 }
                 MiniEvent::getInstance()->createEvent($user_id, $device_id, $action, $path, $context, $event_uuid, $share_filter->type);
                 $share_filter->handlerAction($action, $device_id, $path, $context);
                 //
                 // 删除共享目录
                 //
                 if ($v['file_type'] == 2 || $v['file_type'] == 3) {
                     $handler = new ShareManager();
                     $handler->_userId = $share_filter->operator;
                     $handler->_id = $v['id'];
                     try {
                         $handler->invoke(ShareManager::CANCEL_SHARED);
                     } catch (Exception $e) {
                     }
                 }
             }
             $id = $v['id'];
             if (in_array($id, $arr)) {
                 // 排除重复
                 continue;
             }
             if ($v['file_type'] == 0) {
                 array_push($list, $v['version_id']);
             }
             if (strlen($ids) > 0) {
                 $ids = $ids . ",";
             }
             array_push($arr, $id);
             $ids = $ids . $id;
         }
     }
     //
     // 更新文件版本引用次数
     //
     $version = new FileVersion();
     $version->updateRefCountByIds($list);
     //删除共享文件信息
     MiniLink::getInstance()->unlink($ids);
     FileStar::model()->deleteAll('id in (:ids)', array(':ids' => $ids));
     //后台管理员台实现逻辑
     $value = $this->deleteAll("id in(" . $ids . ")");
     return $value;
 }
Example #7
0
 /**
  * 获取文本内容
  * @param $key
  * @param $path
  * @return mixed
  */
 public function txtContent($key, $path)
 {
     $link = MiniLink::getInstance()->getByKey($key);
     if ($link !== NULL) {
         $file = MiniFile::getInstance()->getById($link["file_id"]);
         $parentPath = $file["file_path"];
         if ($file !== NULL) {
             $userId = $file["user_id"];
             $absolutePath = MiniUtil::getAbsolutePath($userId, $path);
             //必须限定子目录在外链目录下
             if (strpos($absolutePath, $parentPath) == 0) {
                 return MiniFile::getInstance()->getTxtContent($absolutePath);
             }
         }
     }
 }
Example #8
0
 /**
  * 判断权限是否匹配
  * @param $path
  * @return bool
  */
 public function privilege($path)
 {
     if (empty($this->user['id'])) {
         //用户未登陆情况下预览权限判断,为外链预览
         $fileObj = MiniFile::getInstance()->getByPath($path);
         $fileId = (int) $fileObj['id'];
         $isLinkExist = MiniLink::getInstance()->getByFileId($fileId);
         //判断是否为外链,不是则判断其父级是否为外链
         $isParentLinked = false;
         if (empty($isLinkExist)) {
             //如果该文件不存在外链,则判断父级目录是否做外链
             $jointPath = '/' . $pathArr[1];
             for ($i = 2; $i < count($pathArr); $i++) {
                 $jointPath .= '/' . $pathArr[$i];
                 $parentFileObj = MiniFile::getInstance()->getByPath($jointPath);
                 $parentFileId = (int) $parentFileObj['id'];
                 $parentLinkObj = MiniLink::getInstance()->getByFileId($parentFileId);
                 $isParentLinkExist = !empty($parentLinkObj);
                 if ($isParentLinkExist) {
                     //如果父级目录存在外链
                     $isParentLinked = true;
                     break;
                 } else {
                     $isParentLinked = false;
                 }
             }
         } else {
             return $canRead = true;
             //如果该文件本身就是外链文件,则可读
         }
         //如果父亲目录是外链目录,则可读;否则不可
         if ($isParentLinked) {
             return true;
         } else {
             return false;
         }
     }
     //用户已登陆情况下,判断文件是否属于自己
     $pathArr = explode('/', $path);
     $masterId = $pathArr[1];
     if ($masterId == $this->user['id']) {
         //如果文件是自己文件,则拥有预览权限
         return true;
     } else {
         //如果文件不为自己文件
         $permission = UserPermissionBiz::getInstance()->getPermission($path, $this->user['id']);
         if (empty($permission)) {
             return false;
         } else {
             return true;
         }
     }
 }
Example #9
0
 /**
  * 移动文件后的扩展操作
  */
 public function extend($from_path, $to_path)
 {
     //删除分享的操作
     $pathFromInfo = MUtils::pathinfo_utf($from_path);
     $pathToInfo = MUtils::pathinfo_utf($to_path);
     if ($pathFromInfo["dirname"] != $pathToInfo["dirname"]) {
         MiniLink::getInstance()->unlink($this->fromId);
     }
 }
Example #10
0
 /** 组装数组
  * @param $fileList
  * @param $shareList
  * @param $key
  * @return array
  */
 private function do2vo($fileList, $shareList, $key)
 {
     if ($key == 1) {
         $list = $fileList;
     } else {
         $list = $shareList;
     }
     $listShare = array();
     foreach ($list as $value) {
         if ($key == 1) {
             $file = $value;
             $shareList = MiniLink::getInstance()->getByFileId($file["id"]);
             $share = $shareList;
             $shareData['file_name'] = null;
         } else {
             $share = $value;
             $fileList = MiniFile::getInstance()->getUndeleteFile($share['file_id']);
             $file = $fileList;
         }
         if (empty($file)) {
             break;
         }
         $shareData['file_name'] = $file['file_name'];
         $shareData['path'] = MiniUtil::getRelativePath($file['file_path']);
         $shareData['size'] = $file['file_size'];
         $shareData['updated_at'] = $share['updated_at'];
         $shareData['share_key'] = $share['share_key'];
         $shareData['file_type'] = $file['file_type'];
         $shareData['link'] = $this->link($share['share_key']);
         $listShare[] = $shareData;
     }
     return $listShare;
 }
Example #11
0
 /**
  * 修改分享信息
  * @param $key
  * @param $shareKey
  * @param $password
  * @param $time
  */
 public function setAccessPolicy($key, $shareKey, $password, $time)
 {
     return MiniLink::getInstance()->setAccessPolicy($key, $shareKey, $password, $time);
 }
Example #12
0
 /**
  * 创建外联(1.6将去掉)
  * @param $fileId
  * @param $status
  * @return array
  */
 public function createLink($fileId, $status)
 {
     if ($status == "0") {
         MiniLink::getInstance()->unlink($fileId);
         $data = array();
         $data["state"] = true;
         $data["code"] = 0;
         return $data;
     } else {
         //创建外链
         $link = MiniLink::getInstance()->create($this->user["id"], $fileId, "", -1);
         $data = array();
         $linkCode = array();
         $linkCode[$fileId] = $link["share_key"];
         $data["linkcode"] = $linkCode;
         $data["state"] = true;
         $data["code"] = 0;
         return $data;
     }
 }
 /**
  * 处理组装请求元数据
  * @param $response
  * @param $file
  * @param $mimeType
  * @return mixed
  */
 private function assembleResponse($response, $file, $mimeType)
 {
     $filePath = $file["file_path"];
     $result = LockBiz::getInstance()->status($filePath);
     $response['lock'] = $result["success"];
     $response["size"] = MUtils::getSizeByLocale($this->locale, $file["file_size"]);
     $response["bytes"] = (int) $file["file_size"];
     $response["path"] = $filePath;
     $response["file_name_pinyin"] = $file['file_name_pinyin'];
     $response["modified"] = MUtils::formatIntTime($file["file_update_time"]);
     $response["create_time"] = $file["file_create_time"];
     $response["update_time"] = $file["file_update_time"];
     $response["revision"] = intval($file["version_id"]);
     $response["rev"] = strval($file["version_id"]);
     $response["root"] = $this->root;
     $response["hash"] = !empty($file["signature"]) ? $file["signature"] : "";
     $response["event"] = $file["event_uuid"];
     $response["sort"] = (int) $file["sort"];
     //外链Key
     $link = MiniLink::getInstance()->getByFileId($file['id']);
     if (empty($link['share_key'])) {
         $response["share_key"] = '';
     } else {
         $response["share_key"] = $link['share_key'];
     }
     $response['is_dir'] = false;
     $permission = UserPermissionBiz::getInstance()->getPermission($filePath, $this->userId);
     if (!empty($permission)) {
         if (isset($permission['children_shared'])) {
             $response['children_shared'] = true;
         } else {
             $permission["share_model"] = $this->getShareModel($filePath);
             $response['share'] = $permission;
         }
         $filePermission = new MiniPermission($permission['permission']);
         $response['canDelete'] = $filePermission->canDeleteFile();
         if (empty($permission['permission'])) {
             return null;
         }
     }
     if ($file["file_type"] == MConst::OBJECT_TYPE_FILE) {
         $mimeType = MiniUtil::getMimeType($file['file_path']);
         $response["thumb_exists"] = MUtils::isExistThumbnail($mimeType, (int) $file["file_size"]);
     } else {
         $response['is_dir'] = true;
     }
     if ($file["file_type"] > MConst::OBJECT_TYPE_FILE) {
         $response["type"] = (int) $file["file_type"];
     }
     if (!empty($mimeType)) {
         $response["mime_type"] = $mimeType;
     }
     if ($file["is_deleted"] == true) {
         $response["is_deleted"] = true;
     }
     return $response;
 }
Example #14
0
 /**
  * 删除回收站所有记录, 但保留源数据
  * @since 1.0.0
  * by Kindac
  */
 private function handleSuperClean()
 {
     $this->fromIds = $this->getTrashList();
     if (empty($this->fromIds)) {
         $this->handleResult(TRUE, 0, Yii::t('api_message', 'action_success'));
         Yii::app()->end();
     }
     $files = UserFile::model()->getFilesByIds($this->fromIds, 1);
     //         $files = UserFile::model()->findAllByAttributes(array("user_id" => $this->_userId, "is_deleted" => 1));
     $ids = array();
     foreach ($files as $file) {
         array_push($ids, $file["id"]);
         //
         // 将文件的版本引用次数减1
         //
         if ($file['file_type'] == 0) {
             MiniVersion::getInstance()->updateRefCount($file['version_id'], FALSE);
         }
     }
     $ids = join(",", $ids);
     // 我的最爱和分享都删除
     $value = 0;
     if (!empty($ids)) {
         FileStar::model()->deleteAll('id in (' . $ids . ')');
         MiniLink::getInstance()->unlink($ids);
         $value = UserFile::model()->updateAll(array("is_deleted" => -1), "id in ({$ids})");
     }
     if ($value >= 0) {
         $this->handleResult(TRUE, 0, Yii::t('api_message', 'action_success'));
     }
 }