Простая работа с Amazon S3 на PHP
По традиции получилась некоторая серия статей по работе с различными API облачных хранилищ.
Совсем недавно было описание про работу с Яндекс Диском API на PHP, а теперь опишем работу с интересным зарубежным облачным сервисом Amazon S3.
В моем примере используются тестовые токены, которые были получены давным-давно. Тем не менее, сам скрипт до сих пор работает, а вот доступ к управлению токенами я, к сожалению, потерял. Поэтому, получение самих токенов предоставляю вам самим (в рамки статьи получение токенов не входит).
Листинг основного файла (index.php):
<?php // Include the SDK using the Composer autoloader require 'vendor/autoload.php'; use Aws\S3\S3Client; use Aws\S3\MultipartUploader; use Aws\Exception\MultipartUploadException; // Callback URL $redirectUri = 'http://' . $_SERVER ['HTTP_HOST']; $bucket = 'drive-19012018'; $s3Client = new S3Client([ 'version' => 'latest', 'region' => 'us-west-2', 'credentials' => [ 'key' => 'AKIAJT4HQHXQRNDFC6KQ', 'secret' => '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', ], ]); if ($_POST){ // Upload if (isset($_POST['upload']) && isset($_FILES['files'])){ if ($_FILES['files']['error'][0] == 0) { $files = normalizeFilesArray($_FILES); foreach ($files as $file) { $uploader = new MultipartUploader($s3Client, $file['tmp_name'], [ 'bucket' => $bucket, 'key' => $file['name'], 'acl' => 'public-read' ]); try { $uploader->upload(); } catch (MultipartUploadException $e) { die($e->getMessage() . "<br>"); } } location($redirectUri); } } // Delete if (isset($_POST['delete']) && isset($_POST['remfile'])){ $result = $s3Client->deleteObject([ 'Bucket' => $bucket, 'Key' => $_POST['remfile'], ]); location($redirectUri); } } /* * Формируем вывод объектов из Амазона */ $listObjects = $s3Client->listObjects([ 'Bucket' => $bucket ])->toArray(); $listFiles = array(); $i=1; if (!empty($listObjects['Contents'])) { foreach ($listObjects['Contents'] as $k => $f) { $listFiles[$k] = $f; $listFiles[$k]['position'] = $i++; $listFiles[$k]['folder'] = isFolder($f['Key']); // Сортировка для папок и вложенных файлов if (stripos($f['Key'], '/') !== false) { $listFiles[$k]['position'] = 0; } } } // Функция сортировки usort($listFiles, function($a, $b) { return $a['position'] <=> $b['position']; }); // Является ли папкой function isFolder($name) { $e = explode('/', $name); if (isset($e[1]) && empty($e[1])){ return 1; } return 0; } // Переадресация по url function location($url) { header('location:' . $url); exit; } // Нормальный вид загружаемых файлов function normalizeFilesArray($files = []) { $result = []; foreach ($files as $file) { if (!is_array($file['name'])) { $result[] = $file; continue; } foreach ($file['name'] as $key => $filename) { $result[$key] = [ 'name' => $filename, 'type' => $file['type'][$key], 'tmp_name' => $file['tmp_name'][$key], 'error' => $file['error'][$key], 'size' => $file['size'][$key] ]; } } return $result; } include 'index.phtml';
Листинг файла с разметкой (index.phtml):
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Amazon S3</title> <style type="text/css"> input[type="submit"] { border-radius: 0; border: 1px solid #999; } </style> </head> <body> Ваш <a href="https://s3.console.aws.amazon.com/s3/buckets/drive-19012018/?region=us-east-2&tab=overview" target="_blank">Amazon</a>. <h2>Загрузка файлов на Amazon</h2> <form method="post" enctype="multipart/form-data"> <table> <tr> <td colspan="2"> <input type="file" name="files[]" multiple> <input type="submit" name="upload" value="Загрузить" > </td> </tr> </table> </form> <h2>Список файлов и папок Amazon</h2> <ul> <? foreach ($listFiles as $item) {?> <li> <? if ($item['folder'] == 1) {?> <img src="folder.png" alt=""> <? } ?> <a href="https://s3.console.aws.amazon.com/s3/object/<?= $bucket ?>/<?= htmlspecialchars(rtrim($item['Key'], '/')) ?>?region=us-east-2&tab=overview" target="_blank"><?= $item['Key'] ?></a> <form method="post"> <input type="hidden" name="remfile" value="<?= htmlspecialchars($item['Key']) ?>"> <input type="submit" name="delete" value="Удалить"> </form> </li> <? }?> </ul> </body> </html>
А это пример того, как будет выглядеть запущенный скрипт с добавленными файлами.
Для удобства закачал проект на Github. Не забываем выполнить в консоле команду $ composer install
.
Спасибо за внимание и до новых встреч!
Полезные материалы: