【问题标题】:How to create download link for an Amazon S3 bucket's object?如何为 Amazon S3 存储桶的对象创建下载链接?
【发布时间】:2012-05-26 15:42:02
【问题描述】:

我正在使用 S3 PHP 类学习 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 类中。

我正在使用 Undesign 的 Amazon S3 PHP class。

【问题讨论】:

标签: php api amazon-s3 amazon-web-services


【解决方案1】:

以下模式可用于构建 S3 URL:

http(s)://<bucket>.s3.amazonaws.com/<object>
http(s)://s3.amazonaws.com/<bucket>/<object>

【讨论】:

【解决方案2】:

如果想让公众访问bucket,就这么简单

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

只要你正确设置权限。

如果您担心下载滥用,您将需要一个经过身份验证的 URL(我猜您希望从您的代码示例中获得该 URL)。在这种情况下,我建议您使用 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

【讨论】:

【解决方案3】:

我看到人们已经对此做出了回应,但我想为那些可能拥有安全存储桶(需要访问权限)的人添加更多上下文。请注意,如果您直接与 S3 存储桶对话,则不必生成 URL,然后您可以使用 'file_get_contents' 等,但速度要慢得多,因为您不能使用多卷曲请求(为了速度)。但是,如果您有较新的 php 版本,则可以使用 pthreads。

安装: 为 Amazon 安装 S3 类文件,有很简单的方法可以使用 composer 添加它或手动下载 S3.php 文件。

不安全: (这件事看其他帖子,基本都是用网址)

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 并使用 multi curl 工具同时获取它们(推荐)。

一个简单的例子:

$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;
}

【讨论】:

    【解决方案4】:

    如果您使用aws-sdk-php v3 并且您的文件是私有的。

    $cmd = $s3Client->getCommand('GetObject', [
        'Bucket' => 'my-bucket',
        'Key' => 'testKey'
    ]);
    
    $request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
    
    $presignedUrl = (string) $request->getUri();
    

    【讨论】:

      【解决方案5】:

      除了Hossein's answer之外,如果您想在访问链接后立即开始下载(模拟“另存为...”行为),您需要在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();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        • 2011-12-23
        • 2013-08-23
        • 2012-04-12
        • 2011-08-22
        • 2015-09-01
        • 1970-01-01
        相关资源
        最近更新 更多