2015-05-29 7 views
7

Secondo questo link http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-s3.html, posso creare facilmente un collegamento presigned semplicemente aggiungendo la durata della vita di getObjectUrlCreazione di Amazon AWS s3 pre url firmato PHP

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

Ma io ottenere un URL semplice, si sa, senza la parametri awsaccesskeyid e scade,

Ecco il mio codice:

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

EDIT: ho AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY come variabili d'ambiente

mio eco assomiglia:

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

Cosa c'è di sbagliato?

+0

dove si effettua passando chiave e segreto AWS, da utilizzare nella firma processo? –

+0

Sono impostati come variabili di ambiente. – Lauro182

risposta

17

Bene, se qualcun altro ha problemi con questo come ho fatto io, ecco la risposta, sono andato nei forum di sviluppo php di Amazon e ho ricevuto aiuto dai professionisti.

Sembra che si possa essere un flip-flopping tra la Versione 2 e la Versione 3 dell'SDK o guardare il documento sbagliato. Assicurati di ottenere quello che intendi utilizzare e stai guardando la documentazione corretta. Sono diversi.

V3 - Compositore Presupposto: { "AWS/AWS-sdk-php": "~ 3.0"} - Guida per l'utente: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/index.html - Documentazione API: http://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html - Documenti pre-firmato URL: http://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-presigned-url.html

V2 - Compositore Presupposto: { "AWS/AWS-sdk-php": "~ 2.8"} - Guida per l'utente: http://docs.aws.amazon.com/aws-sdk-php/v2/guide/index.html - Documentazione API: http://docs.aws.amazon.com/aws-sdk-php/v2/api/index.html - Documenti pre-firmato URL: http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-s3.html#creating-a-pre-signed-url

.210

guida Mini step-by-step di quello che hai da fare:

1.Installare compositore, preferibilmente utilizzando sudo:

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

2.Go alla cartella di progetto e creare un composer.json file, con la versione desiderata/necessaria, puoi trovare le versioni qui: https://github.com/aws/aws-sdk-php/releases, i comandi per ogni versione sembrano essere molto specifici della versione, fai attenzione, questo era il mio problema principale.

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

}

3.Then andare alla cartella del progetto nel terminale, e l'installazione sdk via compositore e aggiornamento in seguito come: (. Se si cambia la versione è necessario aggiornare di nuovo)

sudo php composer.phar install 
    sudo php composer.phar update 

4. Quindi tutto è pronto per seguire la documentazione della versione corretta, nel mio caso per la versione "aws/aws-sdk-php": "~ 3.0" e per l'URL presigned, ciò che ha funzionato è stato:.

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; 

Spero che questo aiuta a chiunque di fronte gli stessi problemi come ho fatto

+0

Qui è +20 minuti. C'è un limite al tempo minimo? Sto provando +3 secondi, ci vogliono più di 10 secondi per scadere –

+0

La documentazione non dice nulla sui limiti, "Il momento in cui l'URL dovrebbe scadere. Può essere un timestamp Unix, un oggetto DateTime PHP o una stringa che può essere valutata da strtotime(). "Http://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws .S3.S3Client.html # _createPresignedRequest – Lauro182