/** * 形成最终第三方所需数据 */ 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; }
/** * 分享用户指定分享 * @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; }
/** * 删除文件 * @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; }
/** * 检查密码 * @return mixed */ public function checkPassword() { $key = MiniHttp::getParam("key", ""); $password = MiniHttp::getParam("password", ""); $result = MiniLink::getInstance()->checkPassword($key, $password); return $result; }
/** * 彻底删除文件 * 根据{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; }
/** * 获取文本内容 * @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); } } } }
/** * 判断权限是否匹配 * @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; } } }
/** * 移动文件后的扩展操作 */ 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); } }
/** 组装数组 * @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; }
/** * 修改分享信息 * @param $key * @param $shareKey * @param $password * @param $time */ public function setAccessPolicy($key, $shareKey, $password, $time) { return MiniLink::getInstance()->setAccessPolicy($key, $shareKey, $password, $time); }
/** * 创建外联(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; }
/** * 删除回收站所有记录, 但保留源数据 * @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')); } }