Простая работа с 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>

А это пример того, как будет выглядеть запущенный скрипт с добавленными файлами.

Amazon S3 API

Для удобства закачал проект на Github. Не забываем выполнить в консоле команду $ composer install.

Спасибо за внимание и до новых встреч!

Полезные материалы:

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: