Tengo algunos problemas al intentar cargar una imagen en AWS S3. Parece cargar el archivo correctamente pero, cada vez que intento descargarlo o obtener una vista previa, no se puede abrir. Actualmente, este es el código de carga que estoy usando:
<?php require_once 'classes/amazon.php'; require_once 'includes/aws/aws-autoloader.php'; use Aws\S3\S3Client; $putdata = file_get_contents("php://input"); $request = json_decode($putdata); $image_parts = explode(";base64,", $request->image); $image_type_aux = explode("image/", $image_parts[0]); $image_type = $image_type_aux[1]; $image_base64 = $image_parts[1]; $dateTime = new DateTime(); $fileName = $dateTime->getTimestamp() . "." . $image_type; $s3Client = S3Client::factory(array( 'region' => 'eu-west-1', 'version' => '2006-03-01', 'credentials' => array( 'key' => Amazon::getAccessKey(), 'secret' => Amazon::getSecretKey(), ) )); try { $result = $s3Client->putObject(array( 'Bucket' => Amazon::getBucket(), 'Key' => 'banners/' . $fileName, 'Body' => $image_base64, 'ContentType' => 'image/' . $image_type, 'ACL' => 'public-read' )); echo $result['ObjectURL'] . "\n"; } catch(S3Exception $e) { echo $e->getMessage() . "\n"; } ?>Entonces, cuando reviso la consola después de cargar el archivo de imagen, tiene el tamaño, los permisos y los encabezados esperados pero, como dije, cada vez que intento abrir el archivo, falla.
Cual podría ser el problema aquí? Gracias por adelantado.
El problema aquí es que parece estar cargando la versión codificada en base64 de la imagen y no los bytes sin procesar de la imagen. Tome $image_base64 y decodifique en bytes sin procesar primero http://php.net/manual/en/function.base64-decode.php . Estoy seguro de que si intentara abrir esas "imágenes" en un editor de texto, vería datos hexadecimales base64.
puede cargar "sobre la marcha" usando la función $s3Client->upload como en el siguiente ejemplo:
<?php $bucket = 'bucket-name'; $filename = 'image-path.extension'; $imageData = base64_decode(end(explode(",", $base64))); $upload = $s3Client->upload($bucket, $filename, $imageData, 'public-read'); $upload->get('ObjectURL');Uso silex php 2.0 y la siguiente fuente de código
$s3 = $app['aws']->createS3(); $putdata = file_get_contents("php://input"); $data = json_decode($request->getContent(), true); $data = (object) $data; $image_parts = explode(";base64,", $data->image); $image_type_aux = explode("image/", $image_parts[0]); $image_type = $image_type_aux[1]; $image_base64 = base64_decode($image_parts[1]); $result = $s3->putObject([ 'ACL' => 'public-read', 'Body' => $image_base64, 'Bucket' => 'name-bucket', 'Key' => 'test_img.jpeg', 'ContentType' => 'image/' . $image_type, ]); var_dump($result['ObjectURL']);