Итак, я попробовал несколько способов получить файл для загрузки на мою учетную запись S3. Наконец-то я оказался где-то и БУМ — запутанная документация и странные сообщения об ошибках, которые кажутся противоречащими друг другу
Хорошо, для начала я не использую композитор или что-то подобное, я делаю это по старинке:
require '/path/to/aws-autoload.php';
Теперь он загружается правильно, и я сократил автозагрузку, чтобы использовать только классы Common и S3 — не нужно все!
Далее я загружаю клиент S3 и учетные данные:
use Aws\S3\S3Client;
use Aws\Common\Credentials\Credentials;
Теперь код для начала волшебства происходит:
$file = '/path/to/' . $filename;
$credentials = new Credentials('KEY', 'SECRET KEY');
$s3 = S3Client::factory(array('credentials' => $credentials));
try{
$s3->putObject(array(
'Bucket' => 'sub.domain.com.s3.amazonaws.com',
'Body' => fopen($file, 'r'),
'ACL' => 'public-read',
));
} catch (S3Exception $e) {
$result = array(
'ok' => false,
'descr' => 'There was an error uploading the file to S3 : ' . $filename
);
}
Кажется, у меня проблема с самим «Ковшом».
Когда я форматирую ведро как sub.domain.com Я получаю следующее сообщение от API AWS:
Сообщение об ошибке AWS: адрес, к которому вы пытаетесь получить доступ, должен быть адресован с использованием указанной конечной точки. Пожалуйста, отправляйте все будущие запросы этой конечной точке: «sub.domain.com.s3.amazonaws.com».
Теперь, когда я изменяю ‘Bucket’, чтобы соответствовать вышеуказанному, вот так: sub.domain.com.s3.amazonaws.com
Я получаю следующее сообщение об ошибке:
Сообщение об ошибке AWS: указанный сегмент не существует
Я делаю что-то неправильно? Чего-то не хватает? К сожалению, документация AWS не совсем в порядке. Похоже, что API сейчас противоречит самому себе. Я знаю, что все ключи правильные, и все разрешения правильные. Он перешел с 301 — Перенаправление на 404 — Не найдено по собственному совету.
Любая помощь / совет будет принята с благодарностью. Я чувствую, что я иду по кругу немного здесь!
Вот некоторые вещи, которые нужно перепроверить.
S3Client
с этим регионом [..., 'region' => 'us-west-2', ...]
,'Bucket'
Параметр должен быть точно указан как ваш контейнер (например, если ваш контейнер называется «sub.domain.com», то 'Bucket'
параметр должен быть установлен в 'sub.domain.com'
). Не включайте регион или «s3.amazonaws.com» в 'Bucket'
параметр (т. е. ведро! = конечная точка). SDK автоматически определяет конечную точку (на основе региона клиента и предоставленного имени сегмента) и при необходимости корректирует URL-адрес для стиля пути.'Key'
параметр, которого нет в приведенном выше примере кода.Других решений пока нет …