web-dev-qa-db-ja.com

Amazon awss3の事前署名されたURLの作成PHP

このリンクによると http://docs.aws.Amazon.com/aws-sdk-php/v2/guide/service-s3.html 、私は簡単に人生を追加するだけで署名されたリンクを作成することができますgetObjectUrlまでのスパン

$signedUrl = $client->getObjectUrl($bucket, 'data.txt', '+10 minutes');
// > https://my-bucket.s3.amazonaws.com/data.txt?AWSAccessKeyId=[...]&Expires=[...]&Signature=[...]

しかし、awsaccesskeyidとexpiresパラメーターのないプレーンなURLを取得します。

これが私のコードです:

$bucket = 'imagenesfc';
$keyname = 'NASimagenes/codigoBarraBoleto/1001000098.png';
$filepath = 'NASimagenes/codigoBarraBoleto';

// Instantiate the client.
$s3 = S3Client::factory(array(
    'version' => 'latest',
    'region' => 'us-west-1'
));
 $signedUrl = $s3->getObjectUrl($bucket, $keyname,'+10 minutes');
// > https://my-bucket.s3.amazonaws.com/data.txt?AWSAccessKeyId=[...]&Expires=[...]&Signature=[...]
 echo $signedUrl."<br>";

編集:環境変数としてAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYがあります

私のエコーは次のようになります:

https://s3-us-west-1.amazonaws.com/imagenesfc/NASimagenes/codigoBarraBoleto/1001000098.png

どうしましたか?

13
Lauro182

さて、私がしたように他の誰かがこれに問題を抱えているなら、ここに答えがあります、私はAmazon php開発フォーラムに行き、専門家から助けを得ました。

SDKのバージョン2とバージョン3の間でフリップフロップを行っているか、間違ったドキュメントを参照しているようです。使用する予定のドキュメントを入手し、正しいドキュメントを確認してください。彼らは違う。

V3-Composer要件:{"aws/aws-sdk-php": "〜3.0"}-ユーザーガイド: http://docs.aws.Amazon.com/ aws-sdk-php/v3/guide/index.html --APIドキュメント: http://docs.aws.Amazon.com/aws-sdk-php/v3/api/index.html -事前署名されたURLドキュメント: http://docs.aws.Amazon.com/aws-sdk-php/v3/guide/service/s3-presigned-url.html

V2-Composer要件:{"aws/aws-sdk-php": "〜2.8"}-ユーザーガイド: http://docs.aws.Amazon.com/ aws-sdk-php/v2/guide/index.html --APIドキュメント: http://docs.aws.Amazon.com/aws-sdk-php/v2/api/index.html -署名済みURLドキュメント: http://docs.aws.Amazon.com/aws-sdk-php/v2/guide/service-s3.html#creating-a-pre-signed-url

あなたがしなければならないことのミニステップバイステップガイド:

1.composerをインストールします。できればSudoを使用します。

    Sudo curl -sS https://getcomposer.org/installer | Sudo php

2.プロジェクトフォルダーに移動し、composer.jsonファイルを作成します。必要なバージョンを使用して、リリースをここで見つけることができます: https://github.com/aws/aws-sdk-php/releases 、各バージョンのコマンドはバージョン固有のようです。注意してください。これが私の主な問題でした。

{
    "require": {
        "aws/aws-sdk-php": "~3.0"
    }

}

3.次に、ターミナルのプロジェクトフォルダーに移動し、composerを介してsdkをインストールし、後で次のように更新します(バージョンを変更した場合は、再度更新する必要があります)。

    Sudo php composer.phar install
    Sudo php composer.phar update

4.これで、適切なバージョンのドキュメントに従う準備が整いました。私の場合、バージョン "aws/aws-sdk-php": "〜3.0"で、事前に署名されたURLの場合、機能しました。

    require 'vendor/autoload.php';
    use Aws\S3\S3Client;
    use Aws\S3\Exception\S3Exception;

    $sharedConfig = [
        'region'  => 'us-west-1',
        'version' => 'latest'
    ]; //I have AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY as environment variables

    $s3Client = new Aws\S3\S3Client($sharedConfig);

    $cmd = $s3Client->getCommand('GetObject', [
        'Bucket' => $bucket,
        'Key'    => $keyname
    ]);

    $request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
    $presignedUrl = (string) $request->getUri();
    echo $presignedUrl;

これが私と同じ問題に直面している人の助けになることを願っています。

28
Lauro182

Laravelを使用している場合は、ここに記載されているように、S3の一時URLを簡単に取得できます: https://laravel.com/docs/master/filesystem #file-urls

Imageモデルの例は次のようになります。

class Image extends Model
{

    ...

    public function getTemporaryUrlAttribute()
    {
        return Storage::disk('s3')->temporaryUrl(
            $this->path,
            now()->addSeconds(10)
        );
    }
}

次に、HTMLでは次のようになります。

<img width="100px" src="{{$image->temporaryUrl}}">
0
Max