我們在S3上的自定義域中託管了大量視頻/ audo /媒體,並創建了一組函數以簽署這些URL並允許它們同時流式傳輸下載。問題是簽名的URL當然不起作用。錯誤是:Amazon S3簽名的URL以更改內容類型
我們計算的請求籤名與您提供的簽名不匹配。檢查你的密鑰和簽名方法。
當然,如果我們把從這個頁面返回的字節碼輸入到Amazon S3 Signature Tester並從那裏獲取字節碼,它就可以工作。即使從我們的函數簽名的字符串以及簽名測試程序中解碼的字節碼都是相同的,它也不會起作用。
它通過的PHP代碼的一小塊所謂:
$headers = createS3parameters($expiry, $file_type);
$request = preg_replace("/^.*?:\/\/.*\//", "/", $bucketurl);
$signature = signRequest($request, $expiry, $s3secret, $headers, "GET", $file_type);
$signed_request = "$bucketurl?AWSAccessKeyId=$s3key&Expires=$expiry&$headers&Signature=$signature";
這是實際簽署它的功能。
function signRequest($request, $expiration, $s3secret, $headers = '', $type = 'GET', $content_type = 'default')
{
if ($expiration == 0 || $expiration == null)
{
$expiration = time() + 315576000; // 10 years (never)
}
if (strcmp($content_type, 'default') == 0)
{
$content_type = "";
}
// S3 tester spits out this format
/*$string = "$type\n".
"\n\n".
"$expiration\n".
"/mybucket$request?$headers";*/
$string = "$type\n".
"\n".
"$content_type\n".
"$expiration\n".
"$headers\n".
"$request";
// must be in UTF8 format
$string = utf8_encode(trim($string));
// encode to binary hash using sha1. require S3 bucket secret key
$hash = hash_hmac("sha1",$string, $s3secret,false);
// sha1 hash must be base64 encoded
$hash = base64_encode($hash);
// base64 encoded sha1 hash must be urlencoded
$signature = rawurlencode($hash);
return $signature;
}
,然後創建一個URL,例如:
http://mybucket.s3.amazonaws.com/My_Boring_Video.wmv?AWSAccessKeyId=AKIAIEXAMPLE6GA3WYQ&Expires=1344160808&response-content-type=application/force-download&response-expires=1344160808&Signature=OTIxOTI0YjNjMTA1NjMyNmJjYTk0MGE2YWJkMmI5OWQ3MGM2ZGY0MQ%3D%3D
不幸的是不起作用。這裏有一個顯而易見的問題,我一直在盯着太久而無法正確理解?
您使用什麼播放器播放視頻?通常玩家正在追加一些變量,這是問題 – 2012-08-01 17:41:49
這個問題與流式傳輸vs下載無關。當你通過http://mybuckets.s3.amazonaws.com/My_Boring_Video.wmv訪問視頻時,它工作得很好。問題在於簽名的URL經常被AmazonS3拒絕。 – dcmbrown 2012-08-01 19:48:01