diff --git a/application/index/model/Avatar.php b/application/index/model/Avatar.php index d95f530f..2eee3cbb 100644 --- a/application/index/model/Avatar.php +++ b/application/index/model/Avatar.php @@ -4,7 +4,7 @@ namespace app\index\model; use think\Model; use think\Db; use \app\index\model\Option; -use \app\index\model\FileManage; +use \app\index\model\LocalAdapter; class Avatar extends Model{ @@ -90,7 +90,7 @@ class Avatar extends Model{ $filePath = ROOT_PATH . 'public/avatars/' . $this->fileName.$siezSuffix; if(file_exists($filePath)){ ob_end_clean(); - header('Content-Type: '.FileManage::getMimetype($filePath)); + header('Content-Type: '.LocalAdapter::getMimetype($filePath)); $fileObj = fopen($filePath,"r"); while(!feof($fileObj)){ echo fread($fileObj,2097152); @@ -131,7 +131,7 @@ class Avatar extends Model{ } ob_end_clean(); $filePath = ROOT_PATH . 'static/img/default.png' .$siezSuffix; - header('Content-Type: '.FileManage::getMimetype($filePath)); + header('Content-Type: '.LocalAdapter::getMimetype($filePath)); $fileObj = fopen($filePath,"r"); while(!feof($fileObj)){ echo fread($fileObj,2097152); diff --git a/application/index/model/FileManage.php b/application/index/model/FileManage.php index 4d2cae88..64d7aac3 100644 --- a/application/index/model/FileManage.php +++ b/application/index/model/FileManage.php @@ -497,30 +497,31 @@ class FileManage extends Model{ * @return array 重定向信息 */ public function getThumb(){ - switch ($this->policyData["policy_type"]) { - case 'qiniu': - $Redirect = $this->getQiniuThumb(); - return $Redirect; - case 'local': - $Redirect = $this->getLocalThumb(); - return $Redirect; - break; - case 'oss': - $Redirect = $this->getOssThumb(); - return $Redirect; - break; - case 'upyun': - $Redirect = $this->getUpyunThumb(); - return $Redirect; - break; - case 'remote': - $remote = new Remote($this->policyData); - return [1,$remote->thumb($this->fileData["pre_name"],explode(",",$this->fileData["pic_info"]))]; - break; - default: - # code... - break; - } + return $this->adapter->getThumb(); + // switch ($this->policyData["policy_type"]) { + // case 'qiniu': + // $Redirect = $this->getQiniuThumb(); + // return $Redirect; + // case 'local': + // $Redirect = $this->getLocalThumb(); + // return $Redirect; + // break; + // case 'oss': + // $Redirect = $this->getOssThumb(); + // return $Redirect; + // break; + // case 'upyun': + // $Redirect = $this->getUpyunThumb(); + // return $Redirect; + // break; + // case 'remote': + // $remote = new Remote($this->policyData); + // return [1,$remote->thumb($this->fileData["pre_name"],explode(",",$this->fileData["pic_info"]))]; + // break; + // default: + // # code... + // break; + // } } /** @@ -530,29 +531,30 @@ class FileManage extends Model{ * @return array 文件下载URL */ public function Download($isAdmin=false){ - switch ($this->policyData["policy_type"]) { - case 'qiniu': - return $DownloadHandler = $this->qiniuDownload(); - break; - case 'local': - return $DownloadHandler = $this->localDownload($isAdmin); - break; - case 'oss': - return $DownloadHandler = $this->ossDownload(); - break; - case 'upyun': - return $DownloadHandler = $this->upyunDownload(); - break; - case 's3': - return $DownloadHandler = $this->s3Download(); - break; - case 'remote': - return $DownloadHandler = $this->remoteDownload(); - break; - default: - # code... - break; - } + return $this->adapter->Download($isAdmin); + // switch ($this->policyData["policy_type"]) { + // case 'qiniu': + // return $DownloadHandler = $this->qiniuDownload(); + // break; + // case 'local': + // return $DownloadHandler = $this->localDownload($isAdmin); + // break; + // case 'oss': + // return $DownloadHandler = $this->ossDownload(); + // break; + // case 'upyun': + // return $DownloadHandler = $this->upyunDownload(); + // break; + // case 's3': + // return $DownloadHandler = $this->s3Download(); + // break; + // case 'remote': + // return $DownloadHandler = $this->remoteDownload(); + // break; + // default: + // # code... + // break; + // } } /** @@ -659,7 +661,8 @@ class FileManage extends Model{ if(in_array($key,$uniquePolicy["qiniuList"])){ self::qiniuDelete($value,$uniquePolicy["qiniuPolicyData"][$key][0]); }else if(in_array($key,$uniquePolicy["localList"])){ - self::localDelete($value,$uniquePolicy["localPolicyData"][$key][0]); + LocalAdapter::DeleteFile($value,$uniquePolicy["localPolicyData"][$key][0]); + self::deleteFileRecord(array_column($value, 'id'),array_sum(array_column($value, 'size')),$value[0]["upload_user"]); }else if(in_array($key,$uniquePolicy["ossList"])){ self::ossDelete($value,$uniquePolicy["ossPolicyData"][$key][0]); }else if(in_array($key,$uniquePolicy["upyunList"])){ @@ -739,24 +742,6 @@ class FileManage extends Model{ } - /** - * 删除某一策略下的指定本地文件 - * - * @param array $fileList 待删除文件的数据库记录 - * @param array $policyData 待删除文件的上传策略信息 - * @return void - */ - static function localDelete($fileList,$policyData){ - $fileListTemp = array_column($fileList, 'pre_name'); - foreach ($fileListTemp as $key => $value) { - @unlink(ROOT_PATH . 'public/uploads/'.$value); - if(file_exists(ROOT_PATH . 'public/thumb/'.$value."_thumb")){ - @unlink(ROOT_PATH . 'public/thumb/'.$value."_thumb"); - } - } - self::deleteFileRecord(array_column($fileList, 'id'),array_sum(array_column($fileList, 'size')),$fileList[0]["upload_user"]); - } - /** * 删除某一策略下的指定七牛文件 * @@ -839,46 +824,6 @@ class FileManage extends Model{ ])->setDec('used_storage', $size); } - static function getThumbSize($width,$height){ - $rate = $width/$height; - $maxWidth = 90; - $maxHeight = 39; - $changeWidth = 39*$rate; - $changeHeight = 90/$rate; - if($changeWidth>=$maxWidth){ - return [(int)$changeHeight,90]; - } - return [39,(int)$changeWidth]; - } - - static function outputThumb($path){ - ob_end_clean(); - if(!input("get.cache")=="no"){ - header("Cache-Control: max-age=10800"); - } - header('Content-Type: '.self::getMimetype($path)); - $fileObj = fopen($path,"r"); - echo fread($fileObj,filesize($path)); - fclose($file); - } - - public function getLocalThumb(){ - $picInfo = explode(",",$this->fileData["pic_info"]); - $picInfo = self::getThumbSize($picInfo[0],$picInfo[1]); - if(file_exists(ROOT_PATH . "public/thumb/".$this->fileData["pre_name"]."_thumb")){ - self::outputThumb(ROOT_PATH . "public/thumb/".$this->fileData["pre_name"]."_thumb"); - return [0,0]; - } - $thumbImg = new Thumb(ROOT_PATH . "public/uploads/".$this->fileData["pre_name"]); - $thumbImg->thumb($picInfo[1], $picInfo[0]); - if(!is_dir(dirname(ROOT_PATH . "public/thumb/".$this->fileData["pre_name"]))){ - mkdir(dirname(ROOT_PATH . "public/thumb/".$this->fileData["pre_name"]),0777,true); - } - $thumbImg->out(ROOT_PATH . "public/thumb/".$this->fileData["pre_name"]."_thumb"); - self::outputThumb(ROOT_PATH . "public/thumb/".$this->fileData["pre_name"]."_thumb"); - return [0,0]; - } - public function getOssThumb(){ if(!$this->policyData['bucket_private']){ $fileUrl = $this->policyData["url"].$this->fileData["pre_name"]."?x-oss-process=image/resize,m_lfit,h_39,w_90"; @@ -1030,28 +975,6 @@ class FileManage extends Model{ } } - public function localDownload($isAdmin=false){ - $speedLimit = Db::name('groups')->where('id',$this->userData["user_group"])->find(); - $rangeTransfer = $speedLimit["range_transfer"]; - $speedLimit = $speedLimit["speed"]; - $sendFileOptions = Option::getValues(["download"]); - if($sendFileOptions["sendfile"] == "1"){ - $this->sendFile($speedLimit,$rangeTransfer,true,$sendFileOptions["header"]); - }else{ - if($isAdmin){ - $speedLimit = ""; - } - if($speedLimit == "0"){ - exit(); - }else if(empty($speedLimit)){ - $this->outputWithoutLimit(true,$rangeTransfer); - exit(); - }else if((int)$speedLimit > 0){ - $this->outputWithLimit($speedLimit,true); - } - } - } - /** * [List description] * @param [type] $path [description] @@ -1363,33 +1286,34 @@ class FileManage extends Model{ } public function signTmpUrl(){ - switch ($this->policyData["policy_type"]) { - case 'qiniu': - return $this->qiniuPreview()[1]; - break; - case 'oss': - return $this->ossPreview()[1]; - break; - case 'upyun': - return $this->upyunPreview()[1]; - break; - case 's3': - return $this->s3Preview()[1]; - break; - case 'local': - $options = Option::getValues(["oss","basic"]); - $timeOut = $options["timeout"]; - $delayTime = time()+$timeOut; - $key=$this->fileData["id"].":".$delayTime.":".md5($this->userData["user_pass"].$this->fileData["id"].$delayTime.config("salt")); - return $options['siteURL']."Callback/TmpPreview/key/".$key; - break; - case 'remote': - return $this->remotePreview()[1]; - break; - default: - # code... - break; - } + return $this->adapter->signTmpUrl()[1]; + // switch ($this->policyData["policy_type"]) { + // case 'qiniu': + // return $this->qiniuPreview()[1]; + // break; + // case 'oss': + // return $this->ossPreview()[1]; + // break; + // case 'upyun': + // return $this->upyunPreview()[1]; + // break; + // case 's3': + // return $this->s3Preview()[1]; + // break; + // case 'local': + // $options = Option::getValues(["oss","basic"]); + // $timeOut = $options["timeout"]; + // $delayTime = time()+$timeOut; + // $key=$this->fileData["id"].":".$delayTime.":".md5($this->userData["user_pass"].$this->fileData["id"].$delayTime.config("salt")); + // return $options['siteURL']."Callback/TmpPreview/key/".$key; + // break; + // case 'remote': + // return $this->remotePreview()[1]; + // break; + // default: + // # code... + // break; + // } } } diff --git a/application/index/model/LocalAdapter.php b/application/index/model/LocalAdapter.php index 7e3aafe4..c1129a6c 100644 --- a/application/index/model/LocalAdapter.php +++ b/application/index/model/LocalAdapter.php @@ -2,9 +2,13 @@ namespace app\index\model; use think\Model; +use think\Db; use \app\index\model\Option; +/** + * 本地策略文件管理适配器 + */ class LocalAdapter extends Model{ private $fileModel; @@ -265,7 +269,118 @@ class LocalAdapter extends Model{ return $range; } return null; - } + } + + /** + * 生成/返回 文件缩略图 + * + * @return array 重定向信息 + */ + public function getThumb(){ + $picInfo = explode(",",$this->fileModel["pic_info"]); + $picInfo = self::getThumbSize($picInfo[0],$picInfo[1]); + if(file_exists(ROOT_PATH . "public/thumb/".$this->fileModel["pre_name"]."_thumb")){ + self::outputThumb(ROOT_PATH . "public/thumb/".$this->fileModel["pre_name"]."_thumb"); + return [0,0]; + } + $thumbImg = new Thumb(ROOT_PATH . "public/uploads/".$this->fileModel["pre_name"]); + $thumbImg->thumb($picInfo[1], $picInfo[0]); + if(!is_dir(dirname(ROOT_PATH . "public/thumb/".$this->fileModel["pre_name"]))){ + mkdir(dirname(ROOT_PATH . "public/thumb/".$this->fileModel["pre_name"]),0777,true); + } + $thumbImg->out(ROOT_PATH . "public/thumb/".$this->fileModel["pre_name"]."_thumb"); + self::outputThumb(ROOT_PATH . "public/thumb/".$this->fileModel["pre_name"]."_thumb"); + return [0,0]; + } + + /** + * 计算缩略图大小 + * + * @param int $width 原始宽 + * @param int $height 原始高 + * @return array + */ + static function getThumbSize($width,$height){ + $rate = $width/$height; + $maxWidth = 90; + $maxHeight = 39; + $changeWidth = 39*$rate; + $changeHeight = 90/$rate; + if($changeWidth>=$maxWidth){ + return [(int)$changeHeight,90]; + } + return [39,(int)$changeWidth]; + } + + /** + * 输出缩略图 + * + * @param string $path 缩略图文件路径 + * @return void + */ + static function outputThumb($path){ + ob_end_clean(); + if(!input("get.cache")=="no"){ + header("Cache-Control: max-age=10800"); + } + header('Content-Type: '.self::getMimetype($path)); + $fileObj = fopen($path,"r"); + echo fread($fileObj,filesize($path)); + fclose($file); + } + + /** + * 处理下载请求 + * + * @param boolean $isAdmin 是否为管理员请求 + * @return void + */ + public function Download($isAdmin=false){ + $speedLimit = Db::name('groups')->where('id',$this->userModel["user_group"])->find(); + $rangeTransfer = $speedLimit["range_transfer"]; + $speedLimit = $speedLimit["speed"]; + $sendFileOptions = Option::getValues(["download"]); + if($sendFileOptions["sendfile"] == "1"){ + $this->sendFile($speedLimit,$rangeTransfer,true,$sendFileOptions["header"]); + }else{ + if($isAdmin){ + $speedLimit = ""; + } + if($speedLimit == "0"){ + exit(); + }else if(empty($speedLimit)){ + $this->outputWithoutLimit(true,$rangeTransfer); + exit(); + }else if((int)$speedLimit > 0){ + $this->outputWithLimit($speedLimit,true); + } + } + } + + /** + * 删除指定本地文件 + * + * @param array $fileList 待删除文件的数据库记录 + * @param array $policyData 待删除文件的上传策略信息 + * @return void + */ + static function DeleteFile($fileList,$policyData){ + $fileListTemp = array_column($fileList, 'pre_name'); + foreach ($fileListTemp as $key => $value) { + @unlink(ROOT_PATH . 'public/uploads/'.$value); + if(file_exists(ROOT_PATH . 'public/thumb/'.$value."_thumb")){ + @unlink(ROOT_PATH . 'public/thumb/'.$value."_thumb"); + } + } + } + + public function signTmpUrl(){ + $options = Option::getValues(["oss","basic"]); + $timeOut = $options["timeout"]; + $delayTime = time()+$timeOut; + $key=$this->fileModel["id"].":".$delayTime.":".md5($this->userModel["user_pass"].$this->fileModel["id"].$delayTime.config("salt")); + return [1,$options['siteURL']."Callback/TmpPreview/key/".$key]; + } } diff --git a/public/uploads/chunks/.gitignore b/public/uploads/chunks/.gitignore new file mode 100644 index 00000000..c96a04f0 --- /dev/null +++ b/public/uploads/chunks/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file