TP5.1 阿里雲OSS上傳(layui)


插件合集

點擊跳轉

安裝

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'); }
    })
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM