CosService.php 6.6 KB
<?php

namespace App\Services;

use App\Exceptions\InquiryFilterException;
use App\Utils\LogUtils;
use Qcloud\Cos\Client;
/**
 * @remark :对象存储cos
 * @class  :CosService.php
 * @author :lyh
 * @time   :2023/7/19 15:09
 */
class CosService
{

    /**
     * @param $file
     * @remark :上传图片
     * @name   :uploadFile
     * @author :lyh
     * @method :post
     * @time   :2023/7/19 15:28
     */
    public function uploadFile(&$files,$path,$filename, $binary = false)
    {
        $cos = config('filesystems.disks.cos');
        $cosClient = new Client([
            'region' => $cos['region'],
            'credentials' => [
                'secretId' => $cos['credentials']['secretId'],
                'secretKey' => $cos['credentials']['secretKey'],
            ],
        ]);
        $key = $path.'/'.$filename;
        $Body = $binary ? $files : fopen($files->getRealPath(), 'r');
        $cosClient->putObject([
            'Bucket' => $cos['bucket'],
            'Key' => $key,
            'Body' => $Body,
        ]);
        return $key;
    }

    /**
     * @param $image_name
     * @remark :获取图片访问链接
     * @name   :getImageUrl
     * @author :lyh
     * @method :post
     * @time   :2023/7/19 16:08
     */
    public function getImageUrl($image_name)
    {
        $cos = config('filesystems.disks.cos');
        $cosClient = new Client([
            'region' => $cos['region'],
            'credentials' => [
                'secretId' => $cos['credentials']['secretId'],
                'secretKey' => $cos['credentials']['secretKey'],
            ],
        ]);
        $imageUrl = $cosClient->getObjectUrl($cos['bucket'], trim($image_name,'/'), '+10 years');
        return $imageUrl;
    }


    /**
     * 根据远程图片地址上传
     * @param $project_id
     * @param $image_type
     * @param $file_url
     * @param $key
     * @param $body_str
     * @param int $same_name 是否保持名称一直
     * @return string
     * @author Akun
     * @date 2023/09/21 9:39
     */
    public static function uploadRemote($project_id,$image_type,$file_url,$key='',$body_str='',$same_name=0)
    {
        if(!$key){
            $url_arr = parse_url($file_url);

            if($same_name){
                $path_arr = explode('/',$url_arr['path']);
                $filename = end($path_arr);
            }else{
                $ext = explode('.',$url_arr['path']);

                $filename = uniqid().rand(10000,99999).'.'.end($ext);
            }

            $uploads = config('upload.default_file');
            $path = $uploads['path_b'].'/'.$project_id.'/'.$image_type.'/'.date('Y-m');
            $key = $path.'/'.$filename;
        }

        $cos = config('filesystems.disks.cos');
        $cosClient = new Client([
            'region' => $cos['region'],
            'credentials' => [
                'secretId' => $cos['credentials']['secretId'],
                'secretKey' => $cos['credentials']['secretKey'],
            ],
        ]);

        try {
            $body = $body_str ?:curl_c($file_url,false);
        }catch (\Exception $e){
            return '';
        }

        try {
            $cosClient->putObject([
                'Bucket' => $cos['bucket'],
                'Key' => $key,
                'Body' => $body,
            ]);
            return $key;
        }catch (\Exception $e){
            LogUtils::error('uploadRemote error', $e->getMessage());
            return '';
        }
    }

    /**
     * @param $file
     * @return array
     * @throws \Exception
     * @author zbj
     * @date 2023/12/12
     */
    public function checkInquiryFile($file){
        $size = $file->getSize();
        if($size/1024/1024 > 20){
            throw new InquiryFilterException('Your file size exceeds the limit. Please upload a file no larger than 20MB.');
        }
        $extension = $file->getClientOriginalExtension();
//        JPEG (JPG)  PDF  DWG  STEP(STP)IGS word xlsx
        if(!in_array(strtolower($extension), ['png','jpg','jpeg', 'pdf', 'dwg', 'step', 'stp', 'igs','doc','docx','xls','xlsx'])){
            throw new InquiryFilterException('Please upload file in png, jpg, jpeg, pdf, dwg, step, stp, igs, doc, docx, xls or xlsx format.');
        }
        return [
            'size' => $size,
            'extension' => $extension,
            'name' =>  $file->getClientOriginalName(),
            'mime' =>  $file->getMimeType(),
        ];
    }


    /**
     * @remark :生成带水印的图片文件
     * @name   :addFieldImage
     * @author :lyh
     * @method :post
     * @time   :2024/8/19 11:01
     *   gravity/SouthEast:
            gravity:表示水印的对齐方式。常见的值有:
            NorthWest:左上角
            North:顶部中间
            NorthEast:右上角
            West:左侧中间
            Center:中心
            East:右侧中间
            SouthWest:左下角
            South:底部中间
            SouthEast:右下角
     */
    public function addFieldImage($cdnUrl = '',$data = [],$is_image = false){
        if($is_image){
            $param = [
                'image/'.urlSafeBase64Encode($data['image']),//文字水印名称
                $data['position'] ?? 'gravity/SouthEast',
                $data['dx'] ?? 'dx/10/dy/10',
                $data['font'] ?? 'font/5bCP6aOe',//默认宋体
                $data['fontsize'] ?? 'fontsize/24',//大小
                $data['fill'] ?? 'fill/I0ZGRkZGRg==',//颜色
            ];
            $cdnUrl = $cdnUrl.'?imageMogr2/watermark/1/'.implode('/',$param);
        }else{
            $param = [
                'text/'.urlSafeBase64Encode($data['characters']),//文字水印名称
                $data['position'] ?? 'gravity/SouthEast',
                $data['dx'] ?? 'dx/10/dy/10',
                $data['font'] ?? 'font/5bCP6aOe',//默认宋体
                $data['fontsize'] ?? 'fontsize/24',//大小
                $data['fill'] ?? 'fill/I0ZGRkZGRg==',//颜色
            ];
            $cdnUrl = $cdnUrl.'?watermark/2/'.implode('/',$param);
        }
        return $cdnUrl;
    }

    /**
     * @remark :腾讯云安全的base64
     * @name   :urlSafeBase64Encode
     * @author :lyh
     * @method :post
     * @time   :2024/8/19 14:21
     */
    public function urlSafeBase64Encode($data) {
        // 1. 使用标准的 BASE64 编码
        $base64 = base64_encode($data);
        // 2. 将加号(+)替换成连接号(-)
        $base64 = str_replace('+', '-', $base64);
        // 3. 将正斜线(/)替换成下划线(_)
        $base64 = str_replace('/', '_', $base64);
        // 4. 去掉末尾的等号(=)
        $base64 = rtrim($base64, '=');
        return $base64;
    }
}