我的服务器将与S3通信。据我所知,有两种可能性:
1)将文件加载到我的服务器并将其发送给用户,使S3只能访问我服务器的IP 2)在我的服务器上处理身份验证时重定向到S3
我已经理解(我认为)如何做到#1来自: Does Amazon S3 support HTTP request with basic authentication
但有没有办法完成#2?我想避免首先将文件加载到我的服务器然后将其发送给用户的延迟。
我不确定如何在#2中保护S3网址免受公共访问。有人可能会通过我的身份验证,获得下载链接,但该链接可以公开访问。
我一般都是S3的新手,所以如果我误解了任何事情,请耐心等待。
编辑:我查看过期时间的签名链接,但其他人仍然可以访问它们。我也更喜欢使用自己的身份验证,因此只有在用户登录时才允许访问链接。
答案 0 :(得分:1)
您应该尝试下面的代码,服务器会生成一个会在60秒内过期的URL,以便用户直接从S3服务器下载文件。
首先:从这里下载HMAX.php: http://pear.php.net/package/Crypt_HMAC/redirected
<?php
require_once('Crypt/HMAC.php');
echo getS3Redirect("/test.jpg") . "\n";
function getS3Redirect($objectName)
{
$S3_URL = "http://s3.amazonaws.com";
$keyId = "your key";
$secretKey = "your secret";
$expires = time() + 60;
$bucketName = "/your bucket";
$stringToSign = "GET\n\n\n$expires\n$bucketName$objectName";
$hasher =& new Crypt_HMAC($secretKey, "sha1");
$sig = urlencode(hex2b64($hasher->hash($stringToSign)));
return "$S3_URL$bucketName$objectName?AWSAccessKeyId=$keyId&Expires=$expires&Signature=$sig";
}
function hex2b64($str)
{
$raw = ";
for ($i=0; $i < strlen($str); $i+=2)
{
$raw .= chr(hexdec(substr($str, $i, 2)));
}
return base64_encode($raw);
}
?>
试一试。