我正在使用S3 PHP Class学习Amazon S3。我已将所有文件上传到我的S3存储桶,现在我想为我的存储桶中的每个可用文件创建链接。
以下功能对我有用吗?
public static function getAuthenticatedURL($bucket, $uri, $lifetime, $hostBucket = false, $https = false)
{
}
$s3 = new S3('access-key', 'secret-key');
$s3->getAuthenticatedURL($bucket, $uri, $lifetime, $hostBucket = false, $https = false);
或其他功能,例如get_object_url
,但get_object_url()
不在我的S3类中。
我使用的是未设计的Amazon S3 PHP class。
答案 0 :(得分:11)
以下模式对于构建S3 URL有效:
http(s)://<bucket>.s3.amazonaws.com/<object>
http(s)://s3.amazonaws.com/<bucket>/<object>
答案 1 :(得分:5)
如果您希望公众访问存储桶,则只需
的http:// [YourBucketName] .s3.amazonaws.com / [YourFileName]
只要您正确设置权限。
如果您担心下载滥用行为,则需要经过身份验证的网址(我猜您希望从代码中填写)。在这种情况下,我建议您使用Amazon SDK:http://aws.amazon.com/sdkforphp/,因为它包含您需要的示例。
$s3->getObjectUrl($bucket, $filename, '5 minutes');
文档:http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.S3Client.html#_getObjectUrl
答案 2 :(得分:2)
我看到人们已经对此做出了回应,但我想为那些可能拥有安全存储桶(需要访问权限)的用户添加更多上下文。注意,如果直接与S3存储桶对话,则不必生成URL,然后可以使用“file_get_contents”等,但由于无法使用多卷曲请求(速度),因此速度要慢得多。但是,如果你有一个较新的php版本,你可以使用pthreads。
INSTALLATION: 安装Amazon的S3 Class文件,有简单的方法可以使用composer添加它或只是手动下载S3.php文件。
未保密: (关于此事的其他帖子,基本上只使用URL)
http(s)://<bucket>.s3.amazonaws.com/<object>
http(s)://s3.amazonaws.com/<bucket>/<object>
安全的HTTPS(当您的存储桶受到保护时):
https://amazon.com/file/you/wanted.xxx?ID:XXXXX?SIG:YYYYY
(1)创建一个https:// url并使用多卷曲工具同时获取它们(推荐)。
一个简单的例子:
$url = /path/to_the/file_name/file.ext
//note check amazon to confirm the path which will contain only "_" and no spaces.
$s3 = new S3($awsAccessKeyID, $awsSecretKey);
$curls[] = $s3->get_object_url($bucketName, $uri, '1 hour');
var_dump($results = multiCurlRequest($curls));
更多信息:
http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.S3.S3Client.html#_getObjectUrl http://undesigned.org.za/2007/10/22/amazon-s3-php-class/documentation
供参考:
function multiCurlRequest($curlList = array(),$user = '', $pass = '',$timeout = self::MULTI_REQ_TIMEOUT_SECS, $retTxfr = 1) {
if (empty($curlList) || count($curlList) == 0) return false;
$master = curl_multi_init();
$node_count = count($curlList);
for ($i = 0; $i < $node_count; $i++) {
$ch[$i] = curl_init($curlList[$i]);
curl_setopt($ch[$i], CURLOPT_TIMEOUT, $timeout); // -- timeout after X seconds
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, $retTxfr);
curl_setopt($ch[$i], CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch[$i], CURLOPT_USERPWD, "{$user}:{$pass}");
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($master, $ch[$i]);
}
// -- get all requests at once, finish when done or timeout met --
do { curl_multi_exec($master, $running); }
while ($running > 0);
$results = array();
// -- get results from requests --
for ($i = 0; $i < $node_count; $i++) {
$results[$i] = curl_multi_getcontent($ch[$i]);
if ((int) curl_getinfo($ch[$i], CURLINFO_HTTP_CODE) > 399 || empty($results[$i])) {
$this->set_request( [ ['label' => '404', 'href' => $results[$i], '404' => '1' ] ] );
unset($results[$i]);
}
curl_multi_remove_handle($master, $ch[$i]);
curl_close($ch[$i]);
}
curl_multi_close($master);
if (empty($results)) return false;
//$results = array_values($results); // -- removed as we want the original positions
return $results;
}
答案 3 :(得分:0)
如果您使用aws-sdk-php v3
并且文件是私人文件。
$cmd = $s3Client->getCommand('GetObject', [
'Bucket' => 'my-bucket',
'Key' => 'testKey'
]);
$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
$presignedUrl = (string) $request->getUri();
答案 4 :(得分:0)
除了Hossein's answer之外,如果您要在访问链接后立即开始下载(模拟“ 另存为... ”行为),则需要在Bucket旁边添加ResponseContentDisposition参数和Key,就像这样:
$cmd = $s3Client->getCommand('GetObject', [
'Bucket' => 'my-bucket',
'Key' => 'testKey',
'ResponseContentDisposition' => 'attachment; filename="custom_file_name.mp3"'
]);
$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
$presignedUrl = (string) $request->getUri();
注意:自定义文件名是可选的,无需指定它,下载的文件将具有其S3名称。