hyperf 上传文件至华为云 obs | php 技术论坛-大发黄金版app下载

前提

华为的obs上传sdk写的有点一言难尽,而且包的版本全部指定了,无法在hyperf框架中使用。所以自己写了一个。
直接上代码:

config = config('hw');
    }
    /**
     * @param uploadedfile $file
     * @param $filepath string 文件路径
     * @return array
     */
    public function post(uploadedfile $file, $filepath = 'images')
    {
        $this->file = $file;
        //获取后缀
        $fileextension = $file->getextension();
        //生成文件名
        $filename = trim($filepath, '/') . '/' . date('ymdhis') . '_' . uniqid() . '.' . $fileextension;
        $buffers = $this->getbuffers($filename);
        $buffer = $buffers['buffers'];
        $contentlength = $buffers['contentlength'];
        $requestbody = [
            'headers' => [
                'content-type' => 'multipart/form-data; boundary=' . $this->boundary,
                'content-length' =>strval($contentlength) ,
            ],
            'body' => implode('', $buffer),
        ];
        $scheme = $this->config['obs_scheme'];
        $port = $scheme == 'https' ? '443' : '80';
        $host = $scheme . '://' . $this->config['bucket'] . '.' . $this->config['endpoint'] . ':' . $port;
        logger($this->logname)->info('begin request', [
            'requestbody' => $requestbody,
            'host' => $host
        ]);
        $client = new client([
            'verify' => false
        ]);
        try {
            $request = $client->request('post', $host, $requestbody);
            $response = $request->getbody()->getcontents();
            logger($this->logname)->info('result success', [$response]);
            return [
                'status' => true,
                'file_path' => $filename,
                'msg' => null
            ];
        } catch (\exception $e) {
            $message = $e->getresponse()->getbody()->getcontents();
            $message = json_decode(json_encode(simplexml_load_string($message, 'simplexmlelement', libxml_nocdata)), true);
            logger($this->logname)->error('result failed', ['message' => $message]);
            return [
                'status' => false,
                'file_path' => null,
                'msg' => $message
            ];
        }
    }
    /**
     * 获取策略
     * @param $filename
     * @return false|string
     */
    private function getpolicy($filename)
    {
        //头部过期时间
        $expires = gmdate('y-m-d\th:i:s\z', time()   $this->expires);
        $policy = [
            'expiration' => $expires,
            'conditions' => [
                ['bucket' => $this->config['bucket']],
                ['key' => $filename],
                ['x-obs-acl' => $this->obsacl],
                ['content-type' => $this->file->getclientmediatype()],
            ]
        ];
        logger($this->logname)->info('policy', $policy);
        return json_encode($policy);
    }
    /**
     * 获取签名
     * @param $originpolicy
     * @return string
     */
    private function getsign($originpolicy)
    {
        $policy = base64_encode($originpolicy);
        $sign =  base64_encode(hash_hmac('sha1', $policy, $this->config['secret'], true));
        logger($this->logname)->info('sign', [$sign]);
        return $sign;
    }
    /**
     * 返回表单参数
     * @param $filename
     * @return array
     */
    private function getformparams($filename)
    {
        $policy = $this->getpolicy($filename);
        $sign = $this->getsign($policy);
        $formparams = [
            'x-obs-acl' => $this->obsacl,
            'content-type' => $this->file->getclientmediatype(),
            'key' => $filename,
            'policy' => base64_encode($policy),
            'accesskeyid' => $this->config['key'],
            'signature' => $sign
        ];
        logger($this->logname)->info('formparams', $formparams);
        return $formparams;
    }
    /**
     * 获取buffers
     * @param $filename
     * @return array
     */
    private function getbuffers($filename)
    {
        $formparams = $this->getformparams($filename);
        $buffers = [];
        $contentlength = 0;
        /**
         * 从formparams 构造
         */
        $buffer = [];
        $first = true;
        foreach ($formparams as $key => $val){
            if(!$first){
                $buffer[] = "\r\n";
            }else{
                $first = false;
            }
            $buffer[] = "--";
            $buffer[] = $this->boundary;
            $buffer[] = "\r\n";
            $buffer[] = "content-disposition: form-data; name=\"";
            $buffer[] = strval($key);
            $buffer[] = "\"\r\n\r\n";
            $buffer[] = strval($val);
        }
        $buffer = implode('', $buffer);
        $contentlength  = strlen($buffer);
        $buffers[] = $buffer;
        /**
         * 构造描述
         */
        $buffer = [];
        $buffer[] = "\r\n";
        $buffer[] = "--";
        $buffer[] = $this->boundary;
        $buffer[] = "\r\n";
        $buffer[] = "content-disposition: form-data; name=\"file\"; filename=\"";
        $buffer[] = $filename;
        $buffer[] = "\"\r\n";
        $buffer[] = "content-type: " . $this->file->getclientmediatype();
        $buffer[] = "\r\n\r\n";
        $buffer = implode('', $buffer);
        $contentlength  = strlen($buffer);
        $buffers[] = $buffer;
        /**
         * 构造文件数据
         */
        $buffer = [];
        $fp = fopen($this->file->getrealpath(), 'r');
        if($fp){
            while(!feof($fp)){
                $buffer[] = fgetc($fp);
            }
            fclose($fp);
        }
        $buffer = implode('', $buffer);
        $contentlength  = strlen($buffer);
        $buffers[] = $buffer;
        /**
         * 结束构造
         */
        $buffer = [];
        $buffer[] = "\r\n--";
        $buffer[] = $this->boundary;
        $buffer[] = "--\r\n";
        $buffer = implode('', $buffer);
        $contentlength  = strlen($buffer);
        $buffers[] = $buffer;
        $data =  [
            'buffers' => $buffers,
            'contentlength' => $contentlength
        ];
        return $data;
    }
}

新增配置文件config/autoload/hw.php

return [
    'key' => env('obs_access_key', ''),
    'secret' => env('obs_access_secret', ''),
    'endpoint' => env('obs_endpoint', ''),
    'bucket' => env('obs_bucket', ''),
    'obs_cdn_endpoint' => env('obs_cdn_endpoint', ''),
    'obs_scheme' => env('obs_scheme', 'https')
];

完成!

obs
本作品采用《cc 协议》,转载必须注明作者和本文链接
讨论数量: 1

这个用了哪个sdk吗

2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
网站地图