AWS S3 URL 与原始 URL 不同

Pra*_*een 0 php url amazon-s3 amazon-web-services

我正在将文件从 php 上传到 aws s3。我已成功上传文件。

它返回的网址是=> https://BUCKETNAME.s3.ap-south-1.amazonaws.com/images1740/1550830121572.jpg

实际的网址是=> https://s3.ap-south-1.amazonaws.com/BUCKETNAME/images1740/1550830121572.jpg (存储桶名称从网址开头而不是末尾出现)

因此,加载图像时出现错误=>“找不到指定的密钥”

$source = $source;
$bucket = 'xxxxxxxxxxxxxxxxx';
$keyname = 'images'.$usr_id."/".$name;

// for push

$s3 = S3Client::factory(
    array(
        'credentials' => array(
            'key'    => "xxxxxxxxxxxxxx",
            'secret' => "xxxxxxxxxxxxxxx"
        ),
        'version' => 'latest',
        'region'  => 'ap-south-1'
    )
);

try {
    // Upload data.
    $result = $s3->putObject(array(
        'Bucket' => $bucket,
        'Key'    => $keyname,
        'SourceFile' => $source,
        'ServerSideEncryption' => 'AES256',
    ));

    // Print the URL to the object.
    print_r($result);
    return $result['ObjectURL'] . PHP_EOL;
    // print_r($result);
} catch (S3Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

Olu*_*ule 7

初始化 S3 客户端时设置use_path_style_endpoint为 true,使其在构建对象 URL 时默认使用 S3 路径样式端点。1

如果存储桶名称是有效的域名,则实现细节将对象 URL 设为路径样式,否则将回退到 S3 路径样式。
你想一直保留后来的行为。

$s3 = S3Client::factory(
    array(
        'credentials' => array(
            'key'    => "xxxxxxxxxxxxxx",
            'secret' => "xxxxxxxxxxxxxxx"
        ),
        'use_path_style_endpoint' => true,
        'version' => 'latest',
        'region'  => 'ap-south-1'
    )
);
Run Code Online (Sandbox Code Playgroud)

如果您想一次性禁用 PutObject 操作,也可以执行以下操作。

$result = $s3->putObject(array(
    'Bucket' => $bucket,
    'Key'    => $keyname,
    'SourceFile' => $source,
    'ServerSideEncryption' => 'AES256',
    '@use_path_style_endpoint' => true
));
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个答案在技术上准确地解释了即使在不必要的情况下如何强制使用路径样式端点,但需要考虑的一点是这些端点是“完全可互换的”,除非存储桶本身具有一个或多个点“。”以它的名义。(这包括*“如果存储桶名称是有效域名”*,但如果存储桶不是有效域名但仍至少包含一个点,则也应该为 true。)任一端点都可以工作,但都不比其他,并且使用其中一个代替另一个并不能解释“没有这样的键”错误。 (2认同)