hyperf 上传文件至华为云 obs | php 技术论坛-380玩彩网官网入口
前提
华为的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')
];
完成!
本作品采用《cc 协议》,转载必须注明作者和本文链接
这个用了哪个sdk吗