Problemas con Amazon S3 SDK PHP doesObjectExist ()

He vuelto a escribir esta pregunta para que quede más clara, ya que la actualicé.

Tengo problemas con Amazon AWS S3 PHP SDK. Solo estoy tratando de verificar si existe un archivo. Usando este script PHP:

 AWS_ACCESS_KEY_ID, 'secret' => AWS_SECRET_KEY )); $key = 'profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg'; $result = $client->doesObjectExist( AWS_S3_BUCKET, $key ); var_dump(AWS_S3_BUCKET); var_dump($key); var_dump($result); ?> 

Este es el resultado:

 string(19) "stage.socialite.app" string(59) "profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg" bool(false) 

Sé que el archivo existe, está aquí:

http://img.rephp.com/php/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg

Esta es la política de IAM para el usuario, cuya ID de clave y clave secreta estoy usando:

 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::stage.socialite.app/*", "arn:aws:s3:::stage.socialite.app" ] } ] } 

Acabo de crear un nuevo par clave / secreto y los agregué a mi configuración. ¿Qué he hecho mal?

Si var_dump() dice bool(false) o bool(true) , está devolviendo correctamente un valor booleano. print_r() no incluye información de tipo detallada y devuelve una cadena vacía para valores false y null .

Entonces, ¿el objeto realmente existe? Cosas para verificar:

  • Las teclas S3 no tienen barras diagonales. De acuerdo con su código y resultados anteriores, sospecho que este es el problema.
  • Asegúrese de proporcionar el nombre del depósito S3 real y no el nombre de distribución de CloudFront.
  • doesObjectExist() devuelve falso si el usuario no tiene permisos de lectura para ese objeto.

Encontré la respuesta en otra publicación SO, en un comentario de Carlos Castillo :

AWS PHP SDK Versión 2 S3 problema de encoding del nombre de archivo

Me indicó un Issue de Github que sugería establecer la región al inicializar el cliente S3, esto es porque estoy usando una instancia de S3 en Irlanda para mi servidor de desarrollo, no los servidores predeterminados de EE. UU.

Entonces esta es la solución:

 $client = S3Client::factory(array( 'key' => AWS_ACCESS_KEY_ID, 'secret' => AWS_SECRET_KEY, 'region' => AWS_S3_REGION )); 

Donde AWS_S3_REGION es un conjunto constante en mi archivo de configuración, como la clave y el secreto.

El crédito va a neilscastle , Carlos y Stack Overflow por su excelente SEO

Además de corregir la ubicación del depósito y los permisos de lectura:

Si utiliza el cifrado del lado del servidor, debe proporcionar las opciones de SSE con doesObjectExist .

 $s3Client->doesObjectExist($bucket, $key, array( 'SSECustomerAlgorithm' => 'AES256', 'SSECustomerKey' => $encryptionKey, 'SSECustomerKeyMD5' => md5($encryptionKey, true) )); 

Las opciones SSE faltantes o incorrectas arrojarán false retorno false desde doesObjectExist .