Para guardar y leer archivos en S3 desde Laravel usaremos el paquete AWS SDK for PHP. Disponible para Laravel 4 y Laravel 5.
Para subir archivos:
$file = Input::file('file');
$bucket = 'bucketname';
$s3 = AWS::get('s3');
$s3->putObject(array(
'Bucket' => $bucket,
'Key' => $file->getClientOriginalName(),
'SourceFile' => $file->getPathName(), // or local file: public_path() . '/file.gif',
'ContentType' => $creativity->mime_type, // Esta linea hace que cuando linkamos a este archivo desde un html nos lo muestre y no fuerce su descarga
'ContentDisposition' => 'inline; filename=' . $creativity->original_filename,
'ACL' => 'public-read' // para que sea de acceso publico
));
Para listar todos los archivos de un bucket
$bucket = 'bucketname';
$s3 = AWS::get('s3');
$objects = $s3->getPaginator('ListObjects', [
'Bucket' => $bucket
]);
echo "Keys retrieved!" . PHP_EOL;
foreach ($objects as $object) {
echo $object['Key'] . PHP_EOL;
}
Para listar archivos de un bucket (esta opción solo lista los primeros 1000 archivos):
$bucket = 'bucketname';
$s3 = AWS::get('s3');
$result = $s3->listObjects([
'Bucket' => $bucket
])
foreach ($result['Contents'] as $object) {
echo $object['Key'] . PHP_EOL;
}
Para obtener información de un archivo:
$bucket = 'bucketname';
$s3 = AWS::get('s3');
$result = $s3->getObject([
'Bucket' => $bucket,
'Key' => 'carpeta/signatura.gif'
]);
print_r($result);
Eliminar un archivo
$bucket = 'bucketname';
$s3 = AWS::get('s3');
$s3->deleteObject([
'Bucket' => $bucket,
'Key' => $keyname
]);
Eliminar varios archivos
$bucket = 'bucketname';
$s3 = AWS::get('s3');
// 1. List the objects and get the keys.
$keys = $s3->listObjects([
'Bucket' => $bucket
]) ->getPath('Contents/*/Key');
// 2. Delete the objects.
$s3->deleteObjects([
'Bucket' => $bucket,
'Delete' => [
'Objects' => array_map(function ($key) {
return ['Key' => $key];
}, $keys)
],
]);
Copiar archivos de S3 a S3
$s3->copyObject([
'Bucket' => Config::get('app.tasks_bucketname'), // bucketname de destino
'Key' => $s3_key, // destino
'CopySource' => Config::get('app.tasks_bucketname') . '/' . $crea->s3_key, // archivo origen, concatenamos en la url al inicio el bucketname
'ACL' => 'public-read'
]);

