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,截图如下

oss1.png

oss上也有我们上传的图片:

oss2.png

      这样我们就可以在不依赖阿里云SDK的情况下,上传图片至阿里云OSS。

0条评论

发表评论