第一步 執行下面藍色代碼的兩個類 獲取 AccessKeySecret AccessKeyId SecurityToken 這3個參數(sts)返回的結果下面紅色的部分
{
"RequestId": "0548D3A8-CE25-454A-AD99-02B758CF992D",
"AssumedRoleUser": {
"AssumedRoleId": "325499844018321549:test",
"Arn": "acs:ram::1609196445907631:role/aliyunosstokengeneratorrole/test"
},
"Credentials": {
"AccessKeySecret": "6jLdHbeUiiLk29eonTwLLiKEgJu8Wpbq26m58vYrHoPe",
"AccessKeyId": "STS.NK84yMKu6WW7va1WyMcvfJxCZ",
"Expiration": "2018-10-17T03:17:31Z",
"SecurityToken": "CAIS/gF1q6Ft5B2yfSjIr4iNf8P5pqoX4JXcdEeAs3kYb/lKpb3ouDz2IHpJeHhhCewatv0/n2pR6/oTlq1vRoRZHe8qmCPwqsY5yxioRqacke7XhOV2pf/IMGyXDAGBr622Su7lTdTbV+6wYlTf7EFayqf7cjPQND7Mc+f+6/hdY88QQxOzYBdfGd5SPXECksIBMmbLPvvfWXyDwEioVRQw61Mt1z8jtPXnnZPHsyCz1gOqlrUnwK3qOYWhYsVWO5Nybsy4xuQedNCainMMukkaqPsu1fwfo26a4oCHcFBV4gSbNe3P6cFoLwJ/aaU8FrRNsP/mj/p8t/wUCkxrQI/IVxqAAbEkcJnat7qTMuyWDAtaSbzSC/yhh40LNE0ddVomBe464G2+92WZtPsSBNT33tNlHItBa9FV6wudlwwDYcmD3b4V3Le9GVDsIQSBor3mpI5R+Rw4BKxZqkM9PacLpC5IuYJtai6vdVdcDaWcyyl6lCxqKnMHPrh1RJqemA+Is9FQ"
}
}
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/10/7
* Time: 17:43
*/
class sysshop_sts_util{
CONST bucket = 'beh';
CONST endpoint = 'oss-cn-beijing.aliyuncs.com';
CONST format = 'json';
CONST version = '2015-04-01';
CONST accesskeyid = 'LTAIZy0T6hrePIVd';
CONST ck = 'CJWJfF9YtmC5tKoKEH6kh5ujMO2LwG';
CONST signaturemethod = 'HMAC-SHA1';
CONST signatureversion = '1.0';
CONST action = 'AssumeRole';
CONST RoleArn = 'acs:ram::1609196445907631:role/aliyunosstokengeneratorrole';
/**
* 向oss端post請求
* @param array $data
*/
public function request_curl(array $data){
$postUrl = 'https://sts.cn-beijing.aliyuncs.com';
$curlPost = $data;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$postUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$curlCallback = curl_exec($ch);
return $curlCallback;
curl_close($ch);
}
/**
* 獲得簽名信息
* @param $get_key
* @param $get_key_value
* @return string
*/
public function getsignature($get_key,$get_key_value)
{
sort($get_key);
$StringToSign = 'POST&'.urlencode('/').'&';
$q_str = '';
foreach($get_key as $kval){
$q_str .= urlencode($kval).'='.urlencode($get_key_value[$kval]).'&';
}
$q_str = substr($q_str,0,-1);
$StringToSign .= urlencode($q_str);
return $StringToSign;
}
/**
* 獲取參數key值
* @return array
*/
public function getkey()
{
$get_key = array(
'Format',
'Version',
'AccessKeyId',
'RoleArn',
'RoleSessionName',
'SignatureMethod',
'Timestamp',
'SignatureNonce',
'SignatureVersion',
'Action'
);
return $get_key;
}
/**
* 獲取參數數組
* @param $RoleSessionName
* @return array
*/
public function getkeyvalue($RoleSessionName)
{
$h_8_time = time()-8*60*60;
$get_key_value = array(
'Format' => self::format,
'RoleArn'=>self::RoleArn,
'RoleSessionName'=>$RoleSessionName,
'Action' => self::action,
'Version' => self::version,
'SignatureMethod' => self::signaturemethod,
'SignatureNonce' => time(),
'SignatureVersion' => self::signatureversion,
'AccessKeyId' =>self::accesskeyid,
'Timestamp' => date('Y-m-d',$h_8_time).'T'.date('H:i:s',$h_8_time).'Z'
);
return $get_key_value;
}
}
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/10/7
* Time: 13:12
*/
class sysshop_sts_getToken{
CONST bucket = 'beh';
CONST endpoint = 'oss-cn-beijing.aliyuncs.com';
CONST format = 'json';
CONST version = '2015-04-01';
CONST accesskeyid = 'LTAIZy0T6hrePIVd';
CONST ck = 'CJWJfF9YtmC5tKoKEH6kh5ujMO2LwG';
CONST signaturemethod = 'HMAC-SHA1';
CONST signatureversion = '1.0';
CONST action = 'AssumeRole';
CONST RoleArn = 'acs:ram::1609196445907631:role/aliyunosstokengeneratorrole';
private $format;
private $version;
private $accesskeyid;
private $signature;
private $signaturemethod;
private $signatureversion;
private $signaturenonce;
private $timestamp;
private $action;
private $RoleArn;
private $RoleSessionName;
public function getformat()
{
return $this->format;
}
public function getversion()
{
return $this->version;
}
public function getaccesskeyid()
{
return $this->accesskeyid;
}
public function getsignature()
{
return $this->signature;
}
public function getsignaturemethod(){
return $this->signaturemethod;
}
public function getsignatureversion(){
return $this->signatureversion;
}
public function getsignaturenonce(){
return $this->signaturenonce;
}
public function gettimestamp(){
return $this->timestamp;
}
public function getaction(){
return $this->action;
}
/**
* @return string
*/
public function getRoleArn()
{
return $this->RoleArn;
}
/**
* @return string
*/
public function getRoleSessionName()
{
return $this->RoleSessionName;
}
public function index($sessionname)
{
$sysshop_sts_util = new sysshop_sts_util();
$this->RoleSessionName = $sessionname;
$h_8_time = time()-8*60*60;
$get_key = $sysshop_sts_util->getkey();
$get_key_value = $sysshop_sts_util->getkeyvalue($this->RoleSessionName);
$StringToSign = $sysshop_sts_util->getsignature($get_key,$get_key_value);
$this->format = self::format;
$this->version = self::version;
$this->accesskeyid = self::accesskeyid;
$ck = self::ck;
$this->signature = base64_encode(hash_hmac("sha1",$StringToSign,$ck.'&',true));
$this->signaturemethod = self::signaturemethod;
$this->signatureversion = self::signatureversion;
$this->signaturenonce = time();
$this->timestamp = date('Y-m-d',$h_8_time).'T'.date('H:i:s',$h_8_time).'Z';
$this->action = self::action;
$this->RoleArn = self::RoleArn;
return $sysshop_sts_util->request_curl($this->formatpostdata());
}
/**
* 格式化參數
* @return mixed
*/
public function formatpostdata(){
$data['Format'] = $this->getformat();
$data['Version'] = $this->getversion();
$data['AccessKeyId'] = $this->getaccesskeyid();
$data['Signature'] = $this->getsignature();
$data['SignatureMethod'] = $this->getsignaturemethod();
$data['SignatureVersion'] = $this->getsignatureversion();
$data['SignatureNonce'] = $this->getsignaturenonce();
$data['Timestamp'] = $this->gettimestamp();
$data['Action'] = $this->getaction();
$data['RoleArn'] = $this->getRoleArn();
$data['RoleSessionName'] = $this->getRoleSessionName();
return $data;
}
}
$sysshop_sts_getToken = new sysshop_sts_getToken();
$sessionname = 'test';
$callback = $sysshop_sts_getToken->index($sessionname);
print_r($callback);
第二步 前端通過js獲取上面的返回的3個參數實現分片上傳
<html>
<head>
<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js"></script>
</head>
<body>
<input type="file" id="file" />
<script type="text/javascript">
document.getElementById('file').addEventListener('change', function (e) {
var file = e.target.files[0];
var storeAs = 'upload-file';
console.log(file.name + ' => ' + storeAs);
OSS.urllib.request("./upload.php",
{method: 'GET'},
function (err, response) {
if (err) {
return alert(err);
}
try {
result = JSON.parse(response);
alert(result.Credentials.AccessKeySecret);
} catch (e) {
return alert('parse sts response info error: ' + e.message);
}
var bucket = 'beh';
var callback={
"callbackUrl":"www.58chengcheng.com/test.php",
"callbackBody":"mobile=${x:mobile}&type=${x:type}"
}
//定義callbackbody中需要替換的變量
var callbackvar ={
"x:mobile":"13999999999",
"x:type":"1"
}
//64位編碼
var parses = function(data){
var base = new Base64();
var dataBase64 = base.encode(JSON.stringify(data))
console.log(dataBase64)
return dataBase64;
}
var client = new OSS.Wrapper({
accessKeyId: result.Credentials.AccessKeyId,
accessKeySecret: result.Credentials.AccessKeySecret,
stsToken: result.Credentials.SecurityToken,
endpoint: 'oss-cn-beijing.aliyuncs.com',
bucket: 'beh'
});
client.multipartUpload(storeAs, file, {
//headers 頭參數添加
//x-oss-callback 定義的callbackurl+callbackbody Base64編碼後的值
//x-oss-callback-var 自定義參數值替換callbackbody 變量
headers: {
'x-oss-callback':parses(callback),
'x-oss-callback-var': parses(callbackvar)
}
}).then(function (res) {
console.log(res)
}).catch(function (err) {
console.log(err);
});
});
});
function Base64() {
// private property
_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
// public method for encoding
this.encode = function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = _utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
_keyStr.charAt(enc3) + _keyStr.charAt(enc4);
}
return output;
}
// public method for decoding
this.decode = function (input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length) {
enc1 = _keyStr.indexOf(input.charAt(i++));
enc2 = _keyStr.indexOf(input.charAt(i++));
enc3 = _keyStr.indexOf(input.charAt(i++));
enc4 = _keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
}
output = _utf8_decode(output);
return output;
}
// private method for UTF-8 encoding
_utf8_encode = function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
// private method for UTF-8 decoding
_utf8_decode = function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;
while ( i < utftext.length ) {
c = utftext.charCodeAt(i);
if (c < 128) {
string += String.fromCharCode(c);
i++;
} else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
} else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
}
}
</script>
</body>
</html>