插件合集
安裝
composer require aliyuncs/oss-sdk-php
基類
<?php /** * Created by PhpStorm. * User: ZhangYongFeng * Date: 2021/1/5 * Time: 16:37 * ━━━━━━━━━神獸出沒━━━━━━━━━ * ┏┓ ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃ ┃ * ┃ ━ ┃ ++ + + + * ████━████ ┃+ * ┃ ┃ + * ┃ ┻ ┃ * ┃ ┃ + + * ┗━┓ ┏━┛ * ┃ ┃ * ┃ ┃ + + + + * ┃ ┃ Code is far away from bug with the animal protecting * ┃ ┃ + 神獸保佑,代碼無bug * ┃ ┃ * ┃ ┃ + * ┃ ┗━━━┓ + + * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ + + + + * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛+ + + + * ━━━━━━━━━感覺萌萌噠━━━━━━━━━ */ namespace app\base\controller; use think\App; use OSS\OssClient; use OSS\Core\OssUtil; use OSS\Core\OssException; /** * @title OSS * @desc OSS上傳類 * Class Oss * @package app\base\controller */ class Oss extends Base { private $ossConfig; public function __construct(App $app = null) { parent::__construct($app); $this->ossConfig = [ 'accessKeyId' => $this->config['cfg_accessKeyId'], 'accessKeySecret' => $this->config['cfg_accessKeySecret'], 'endpoint' => $this->config['cfg_endpoint'], 'bucket' => $this->config['cfg_bucket'], ]; } /** * 簡單上傳文件 * @param string $url 上傳到OSS的路徑,可自定義 * @param object $uploadFile 上傳的文件 * @return array ['code' => 1001, 'data' => ['url' => ''], 'msg' => '上傳成功'] * @author zyf <1322816443@qq.com> * */ public function upOssSimple($url, $uploadFile) { try{ $ossClient = new OssClient($this->ossConfig['accessKeyId'], $this->ossConfig['accessKeySecret'], $this->ossConfig['endpoint']); $result = $ossClient->uploadFile($this->ossConfig['bucket'], $url, $uploadFile); if (isset($result['info']['http_code']) AND $result['info']['http_code'] == 200) { $data['url'] = $result['info']['url']; return parent::showReturnCode(1001, $data, '上傳成功'); }else{ return parent::showReturnCodeWithOutData(500, 'OSS上傳錯誤'); } } catch(OssException $e) { $msg = $e->getMessage(); return parent::showReturnCodeWithOutData(500, $msg); } } /** * 切片上傳 * @param string $url 上傳到OSS的路徑,可自定義 * @param object $uploadFile 上傳的文件 * @return array ['code' => 1001, 'data' => ['url' => ''], 'msg' => '上傳成功'] * @author zyf <1322816443@qq.com> * */ public function upOssSection($url, $uploadFile) { /** * 步驟1:初始化一個分片上傳事件,獲取uploadId。 */ try{ $ossClient = new OssClient($this->ossConfig['accessKeyId'], $this->ossConfig['accessKeySecret'], $this->ossConfig['endpoint']); //返回uploadId。uploadId是分片上傳事件的唯一標識,您可以根據uploadId發起相關的操作,如取消分片上傳、查詢分片上傳等。 $uploadId = $ossClient->initiateMultipartUpload($this->ossConfig['bucket'], $url); } catch(OssException $e) { $msg = $e->getMessage(); return parent::showReturnCodeWithOutData(500, $msg); } /* * 步驟2:上傳分片。 */ $partSize = 10 * 1024 * 1024; $uploadFileSize = filesize($uploadFile); $pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize); $responseUploadPart = array(); $uploadPosition = 0; $isCheckMd5 = true; foreach ($pieces as $i => $piece) { $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO]; $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1; $upOptions = array( // 上傳文件。 $ossClient::OSS_FILE_UPLOAD => $uploadFile, // 設置分片號。 $ossClient::OSS_PART_NUM => ($i + 1), // 指定分片上傳起始位置。 $ossClient::OSS_SEEK_TO => $fromPos, // 指定文件長度。 $ossClient::OSS_LENGTH => $toPos - $fromPos + 1, // 是否開啟MD5校驗,true為開啟。 $ossClient::OSS_CHECK_MD5 => $isCheckMd5, ); // 開啟MD5校驗。 if ($isCheckMd5) { $contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos); $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5; } try { // 上傳分片。 $responseUploadPart[] = $ossClient->uploadPart($this->ossConfig['bucket'], $url, $uploadId, $upOptions); } catch(OssException $e) { $msg = $e->getMessage(); return parent::showReturnCodeWithOutData(500, $msg); } } // $uploadParts是由每個分片的ETag和分片號(PartNumber)組成的數組。 $uploadParts = array(); foreach ($responseUploadPart as $i => $eTag) { $uploadParts[] = array( 'PartNumber' => ($i + 1), 'ETag' => $eTag, ); } /** * 步驟3:完成上傳。 */ try { // 執行completeMultipartUpload操作時,需要提供所有有效的$uploadParts。OSS收到提交的$uploadParts后,會逐一驗證每個分片的有效性。當所有的數據分片驗證通過后,OSS將把這些分片組合成一個完整的文件。 $result = $ossClient->completeMultipartUpload($this->ossConfig['bucket'], $url, $uploadId, $uploadParts); if (isset($result['info']['http_code']) AND $result['info']['http_code'] == 200) { $data['url'] = $result['info']['url']; return parent::showReturnCode(1001, $data, '上傳成功'); }else{ return parent::showReturnCodeWithOutData(500, 'OSS上傳錯誤'); } } catch(OssException $e) { $msg = $e->getMessage(); return parent::showReturnCodeWithOutData(500, $msg); } } }
后端
public function upOss() { // 文件名稱生成 $file = request()->file('file'); $file_name = sha1(date('YmdHis',time()).uniqid()).'.'.pathinfo($file->getInfo()['name'],PATHINFO_EXTENSION); // 文件路徑生成 switch($this->param['type']){ case "1": $file_path = 'software/'; break; case "2": break; case "3": $file_path = 'manual/'; break; case "4": $file_path = 'file/'; break; } $data = $this->oss->upOssSection($file_path . date('Ymd') .'/'. $file_name, $file->getInfo()['tmp_name']); if($data['code'] == 1001) $data['data']['size'] = trans_byte($file->getInfo()['size']); return $data; }
HTML
<div class="layui-form-item"> <label class="layui-form-label">上傳:</label> <div class="layui-input-block"> <div class="layui-upload"> <input type="hidden" name="url" id="url" value=""> <input type="hidden" name="size" id="size" value=""> <button type="button" class="layui-btn upload">文件</button> </div> </div> </div>
JS
layui.use('upload', function(){ var upload = layui.upload; //執行實例 upload.render({ elem: '.upload' ,data: { type: $("#type").val() } , url: '<{:url(\'upOss\')}>' , multiple: false , accept: 'file' , before: function(obj){ layer.load(1); } , done: function (res) { layer.msg(res.msg) if(res.code == 1001){ $("#url").val(res.data.url); $("#size").val(res.data.size); layer.closeAll('loading'); this.item.html('已上傳,點擊重傳').attr('class', 'layui-btn layui-btn-normal upload') } }, error: function(index, upload){ layer.closeAll('loading'); } }) });