如何为Amazon S3存储桶的对象创建下载链接?

Fra*_*ank 10 php api amazon-s3 amazon-web-services

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

或者是另一个函数get_object_url,但get_object_url()不是在我的S3类中.

我正在使用Undesigned的Amazon S3 PHP类.

小智 11

以下模式对于构造S3 URL有效:

http(s)://<bucket>.s3.amazonaws.com/<object>
http(s)://s3.amazonaws.com/<bucket>/<object>
Run Code Online (Sandbox Code Playgroud)

  • 不能用于下载目的.http://stackoverflow.com/questions/7389394/how-do-i-download-a-file-with-php-and-the-amazon-s3-sdk (3认同)
  • 注意!如果你的存储桶有安全性,这对你不起作用 (2认同)

imp*_*ekt 8

除了Hossein的回答之外,如果您想在访问链接后立即开始下载(模拟“另存为... ”行为),您需要在Bucket和Key旁边添加ResponseContentDisposition参数,如下所示:

$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();
Run Code Online (Sandbox Code Playgroud)

注意:自定义文件名是可选的,如果不指定,下载的文件将具有其 S3 名称。


Rob*_*bie 6

如果您希望公众访问存储桶,那就很简单了

HTTP:// [YourBucketName] .s3.amazonaws.com/[YourFileName]

只要你正确设置权限.

如果你担心下载滥用,你需要一个经过身份验证的URL(我猜你想从你的代码中填写).在这种情况下,我建议您使用Amazon SDK:http://aws.amazon.com/sdkforphp/,因为它包含您需要的示例.

$s3->getObjectUrl($bucket, $filename, '5 minutes');
Run Code Online (Sandbox Code Playgroud)

文档:http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.S3Client.html#_getObjectUrl

  • 对于2015年中期(可能更早)来到这里的任何人,此方法的第三个参数已在SDK中删除,因此您无法以这种方式生成签名URL.有关解决方案,请参阅https://github.com/aws/aws-sdk-php/issues/603. (2认同)