2012-06-01 6 views
17

Sto usando PHP e sto usando l'API S3 per caricare un file, ma volevo assicurarmi che questo nome esatto non esistesse già nel bucket prima del caricamento.Vedere se l'oggetto esiste in S3 usando PHP

Ho trovato alcuni esempi online che utilizzano "file_get_contents" ma questo non significa che prima dovresti scaricare l'intero file? Di solito, questi file sono circa 10 mb, quindi idealmente, non vorrei davvero farlo.

C'è forse un modo per utilizzare "file_get_contents" senza scaricare il file?

O meglio ancora, forse potrei usare una richiesta API per vedere se il nome del file esiste?

Non è importante per me se il contenuto, o la dimensione del file, sia lo stesso, solo il nome del file.

risposta

28

Ottiene se l'Amazon S3 specificato l'oggetto esiste nel bucket specificato.

AmazonS3 doesObjectExist

$s3 = new AmazonS3(); 
$bucket = 'my-bucket' . strtolower($s3->key); 

$response = $s3->doesObjectExist($bucket, 'test1.txt'); 

// Success? (Boolean, not a CFResponse object) 
var_dump($response); 
+3

Questo collegamento e metodo sono per la versione 1 di AWS SDK per PHP. La guida utente aggiornata è qui: http://docs.aws.amazon.com/aws-sdk-php/latest/index.html e la sezione pertinente per verificare l'esistenza di un file sta utilizzando il wrapper del flusso, che si trova qui: http: //docs.aws.amazon.com/aws-sdk-php/guide/latest/feature-s3-stream-wrapper.html – David

+2

il collegamento ai documenti aggiornati, con il metodo esatto è: http://docs.aws .amazon.com/aws-sdk-php/v2/api/class-Aws.S3.S3Client.html # _doesObjectExist –

+2

La funzione corretta da usare dovrebbe essere '$ s3-> doesObjectExist (...)' –

3

Se ha o hanno la possibilità di installare l'estensione PECL HTTP quindi è possibile utilizzare http_head per compilare il modulo di testa facilmente e controllare se la risposta è stata di 200 o 404.

5

Si prega di notare che gli altri suggerimenti sono basati sulla versione 1 del AWS SDK per PHP. Per la versione 2, ti consigliamo di avere familiarità con l'ultima guida trovato qui:

http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html

La sezione "Getting Started" nel link qui sopra vi aiuterà a ottenere l'SDK installato e la configurazione, in modo da essere sicuri prenditi il ​​tuo tempo leggendo quei documenti se non l'hai già fatto. Quando hai finito con l'installazione, ti consigliamo di avere familiarità con il metodo involucro flusso trovate qui:

http://docs.aws.amazon.com/aws-sdk-php/guide/latest/feature-s3-stream-wrapper.html

Infine, qui di seguito è una breve, ad esempio di vita reale di come si potrebbe usare nel flusso del tuo codice.

require('vendor/autoload.php'); 

// your filename 
$filename = 'my_file_01.jpg'; 
// this will use AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY from env vars 
$s3 = Aws\S3\S3Client::factory(); 
// S3_BUCKET must also be defined in env vars 
$bucket = getenv('S3_BUCKET')?: die('No "S3_BUCKET" config var in found in env!'); 
// register stream wrapper method 
$s3->registerStreamWrapper(); 
// does file exist 
$keyExists = file_exists("s3://".$bucket."/".$filename); 
if ($keyExists) { 
    echo 'File exists!'; 
} 
7

tenta di utilizzare codice qui sotto:

$s3 = new S3(); 

$info = $s3->getObjectInfo($bucket, $filename); 
if ($info) 
{ 
    echo 'File exists'; 
} 
else 
{ 
    echo 'File does not exists'; 
} 

scaricare l'SDK S3 da Amazon per PHP. C'è una classe chiamata S3; creare un oggetto di S3. L'oggetto consentirà di chiamare il metodo getObjectInfo(). Passa il nome del bucket S3 e il nome del file (spesso il nome del file è riferito come chiave). Il metodo getObjectInfo() restituirà alcune informazioni se il file esiste, altrimenti il ​​metodo restituirà FALSE.

+0

Una piccola spiegazione potrebbe migliorare questa risposta molto. È attualmente nella coda di revisione "di bassa qualità", probabilmente perché consiste principalmente di codice. – Blorgbeard

+0

Grazie per il tuo commento. Ho appena spiegato il codice. –

+0

Questa dovrebbe essere la risposta barrata. Il più semplice e il migliore –

Problemi correlati