Получить объект AWS S3 с пробелами в имени файла - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь загрузить объект из AWS S3 с помощью SDK для PHP.

$filename = "filename with spaces in it.jpg";

$src = "path/from/bucket-root/".$filename;

$result = S3Client->getObject([

    'Bucket' => 'my-bucket-name',
    'Key' => $src
]);

Когда я запускаю это, я получаю сообщение об ошибке:

Error executing "GetObject" ... GET filename%20with%20spaces%20in%20it.jpg resulted in a 404 Not Found response:

Клиент S3 кодирует пробелы, но затем не может разрешить путь.

Я пробовал все следующее:

$filename = urlencode("filename with spaces in it.jpg");
$filename = urldecode("filename with spaces in it.jpg");
$filename = addslashes("filename with spaces in it.jpg");
$filename = str_replace(' ','+',"filename with spaces in it.jpg");

И несколько комбинаций - в этот момент я просто кидаю в стену какашки.

Мой путь к ключу и имя / маршрут сегмента верны, поскольку я могу успешно получить объект без пробелов в имени файла.

Как мне получить этот объект с пробелами в имени файла?

1 Ответ

0 голосов
/ 29 октября 2018

На самом деле работает без замены пробелов чем-либо, вот рабочий код

<?php
require 'aws/aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

$bucket = 'avitest29oct2018';
$keyname = 'hello there.txt';

$s3 = new S3Client([
  'version' => 'latest',
  'region'  => 'us-west-2',
  'credentials' => false
]);

try {
  // Get the object.
  $result = $s3->getObject([
    'Bucket' => $bucket,
    'Key'    => $keyname
  ]);

  // Display the object in the browser.
  header("Content-Type: {$result['ContentType']}");
  echo $result['Body'];
} catch (S3Exception $e) {
   echo $e->getMessage() . PHP_EOL;
}

?>

Примечание : -

  1. Удалить учетные данные '=> false для чтения личного файла S3
  2. Я заберу свой файл S3 через несколько дней, заменим имя контейнера и имя ключа в приведенном выше коде

Не уверен, что это связано с тем, что вы использовали aws sdk, есть несколько способов установить aws sdk для php, как вы его установили? я использовал 3-й метод (используя zip-файл)

...