В течение нескольких недель я пытался правильно отформатировать REST-запрос к API Amazon AWS S3, используя доступные примеры в Интернете
Вы пробовали Amazon AWS SDK для PHP ? Это всеобъемлющее, полное и, самое главное, написанное Amazon. Если их собственный код не работает для вас, что-то будет действительно не так.
Вот пример кода, использующего связанный SDK для загрузки example.txt
в текущем каталоге в корзину с именем 'my_very_first_bucket'.
<?php
// Complain wildly.
ini_set('display_errors', true);
error_reporting(-1);
// Set these yourself.
define('AWS_KEY', '');
define('AWS_SECRET_KEY', '');
// We'll assume that the SDK is in our current directory
include_once 'sdk-1.3.1/sdk.class.php';
include_once 'sdk-1.3.1/services/s3.class.php';
// Set the bucket and name of the file we're sending.
// It happens that we're actually uploading the file and
// keeping the name, so we're re-using the variable
// below.
$bucket_name = 'my_very_first_bucket';
$file_to_upload = 'example.txt';
// Fire up the object
$s3 = new AmazonS3(AWS_KEY, AWS_SECRET_KEY);
// This returns a "CFResponse"
$r = $s3->create_object(
$bucket_name,
$file_to_upload,
array(
// Filename of the thing we're uploading
'fileUpload' => (__DIR__ . '/' . $file_to_upload),
// ACL'd public.
'acl' => AmazonS3::ACL_PUBLIC,
// No wai.
'contentType' => 'text/plain',
// The docs say it'll guess this, but may as well.
'length' => filesize(__DIR__ . '/' . $file_to_upload)
)
);
// Did it work?
echo "Worked: ";
var_dump($r->isOK());
// Status as in HTTP.
echo "\nStatus: ";
var_dump($r->status);
// The public URL by which we can reach this object.
echo "\nURL: ";
echo $s3->get_object_url($bucket_name, $file_to_upload);
// Tada!
echo "\n";
Соответствующие документы API:
Вы можете перемещаться по остальным методам в левом меню. Он довольно полный, включая создание нового сегмента, управление, удаление, то же самое для объектов и т. Д.
Вы должны быть в состоянии вставить это в свой код и заставить его работать должным образом. PHP 5.2-safe.
Редактировать Серебряный Тигр:
Чарльз -
Вы предоставляете метод, использующий функции API SDK для загрузки файла из локальной файловой системы в корзину по моему выбору. У меня эта часть уже работает через Flex и загрузка работает как шарм. Проблема заключается в том, что я могу отправить запрос REST на AWS S3, чтобы изменить имя файла с его текущего «загруженного» имени на новое имя с более подходящим именем, которое будет работать с моим бэкэндом (база данных, отслеживание и т.д. обрабатывать и отображать отдельно в PHP с MyySQL).
AWS S3 на самом деле не поддерживает функцию «копирования», поэтому они предоставили метод для повторного «PUT» файла путем чтения источника из вашего собственного сегмента и размещения новой копии с другим именем в том же блоке. Трудность, с которой я столкнулся, заключается в обработке запроса REST и, следовательно, шифровании HMAC.
Я ценю ваше время и понимаю приведенный вами пример, так как у меня также есть рабочая копия загрузки PHP, которая работала до того, как я разработал приложение Flex. Причиной для Flex стало включение обновлений состояния и динамически обновляемого индикатора выполнения, который также работает как чудо:).
Я буду продолжать использовать решение REST, поскольку с точки зрения Amason zupport это будет единственный способ переименовать файл, уже существующий в моем сегменте, для каждой группы поддержки.
Как всегда, если у вас есть пожелания или предложения относительно представления REST, я был бы признателен за любые отзывы.
Спасибо,
Серебряный тигр
Подтверждение копирования / удаления работ:
$r = $s3->copy_object(
array( 'bucket' => $bucket_name, 'filename' => $file_to_upload ),
array( 'bucket' => $bucket_name, 'filename' => 'foo.txt' )
);
// Did it work?
echo "Worked: ";
var_dump($r->isOK());
// Status as in HTTP.
echo "\nStatus: ";
var_dump($r->status);
// The public URL by which we can reach this object.
echo "\nURL: ";
echo $s3->get_object_url($bucket_name, 'foo.txt');
echo "\nDelete: ";
// Nuke?
$r = $s3->delete_object($bucket_name, $file_to_upload);
// Did it work?
echo "Worked: ";
var_dump($r->isOK());
// Status as in HTTP.
echo "\nStatus: ";
var_dump($r->status);
Редактировать Серебряный Тигр:
Чарльз -
Нет необходимости в REST, нет проблем ... SDK 1.3.1 и ваша помощь решили проблему. код, который я использовал для тестирования, очень похож на ваш:
// Complain wildly.
ini_set('display_errors', true);
error_reporting(-1);
// Set these yourself.
define('AWS_KEY', 'removed for security');
define('AWS_SECRET_KEY', 'removed for security');
// We'll assume that the SDK is in our current directory
include_once 'includes/sdk-1.3.1/sdk.class.php';
include_once 'includes/sdk-1.3.1/services/s3.class.php';
// Set the bucket and name of the file we're sending.
// It happens that we're actually uploading the file and
// keeping the name, so we're re-using the variable
// below.
$bucket = 'bucket';
$file_to_upload = 'example.txt';
$Source_file_to_copy = 'Album.jpg';
$Destination_file = 'Album2.jpg';
// Fire up the object
// Instantiate the class
$s3 = new AmazonS3();
$response = $s3->copy_object(
array( // Source
'bucket' => $bucket,
'filename' => $Source_file_to_copy
),
array( // Destination
'bucket' => $bucket,
'filename' => $Destination_file
)
);
// Success?
var_dump($response->isOK());
Теперь я выполню удаление после копирования, и мы золотые. Спасибо, сэр, за понимание и помощь.
Серебряный тигр