PHP
PHP实现签名Header上传到阿里云OSS
PHP实现签名Header方式,不依赖SDK上传图片到阿里云OSS
最近突发奇想,研究了阿里云OSS上传图片的SDK,尝试不依赖SDK,走普通的curl请求到阿里云OSS,经过不断的尝试,终于成功将图片上传至阿里云OSS,代码也是非常简洁,下面直接贴出代码:
#配置OSS基本配置 $config = array( 'KeyId' => 'Access Key ID', //Access Key ID 'KeySecret' => 'Access Key Secret', //Access Key Secret 'Endpoint' => 'EndPoint地址', //EndPoint地址 'Bucket' => 'Bucket', //Bucket 'FileUrl' => '图片域名', //图片域名 ); #本地图片地址 $localImageUrl = __DIR__ . "/123.jpg"; #上传文件类型 $mineType = "image/jpeg"; #上传至指定地点 目录/文件名 $key = "mp4/124.jpg"; //获取时间 $dateTime = gmdate("D, d M Y H:i:s") . ' GMT'; #获取sign $signature = ossSign($dateTime, "PUT", $mineType, $config["KeySecret"], $key, $config["Bucket"]); #拼接请求地址 $url = 'http://' . $config['Endpoint'] . "/" . $key; #上传数据体 $data = file_get_contents($localImageUrl); #上传图片 $result = ossRequest($dateTime, $url, 'PUT', $config["KeyId"], $signature, $mineType, $data); #判断是否成功 if (isset($result["Code"])) { $error = isset($result["Message"]) ? $result["Message"] : ""; echo json_encode( array('code' => 404, 'msg' => $error) ); } else { echo json_encode( array('code' => 200, 'msg' => $config["FileUrl"] . $key) ); } /** * 获取签名 * @param string $dateTime //时间 * @param string $method //方法 * @param string $minType //上传文件类型 * @param string $KeySecret //Access Key Secret * @param string $object //上传地址 * @param string $bucket //目录 * @return string */ function ossSign($dateTime = "", $method = "", $minType = "application/json", $KeySecret = "", $object = "", $bucket = "") { //生成初始化签名 $str = $method . "\n\n" . $minType . "\n" . $dateTime . "\n/" . $bucket . "/" . $object; //生成签名 $signature = base64_encode(hash_hmac('sha1', $str, $KeySecret, true)); //返回 return $signature; } /** * 阿里云OSS网络请求 * @param string $dateTime * @param string $url * @param string $method * @param string $accessKey * @param string $signature * @param string $mineType * @param $data * @return mixed */ function ossRequest($dateTime = "", $url = "", $method = "", $accessKey = "", $signature = "", $mineType = "", $data) { //初始化配置 $ch = curl_init(); //初始化CURL句柄 curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); //设置请求方式 //设置头部 $headers = array( "Date:" . $dateTime, 'Content-Type:'.$mineType, "Authorization:OSS " . $accessKey . ":" . $signature ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);//设置HTTP头信息 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串 $document = curl_exec($ch);//执行预定义的CURL curl_close($ch); //XML转数组 $result = ossXmlToArray($document); //返回请求结果 return $result; } /** * XML转数组 */ function ossXmlToArray($xml) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $values; }
调用接口最终成功返回状态码200,失败返回状态码404,截图如下
oss上也有我们上传的图片:
这样我们就可以在不依赖阿里云SDK的情况下,上传图片至阿里云OSS。
0条评论