Как перейти с AWS s3 на Cloudfront

В настоящее время я загружаю фотографии в корзину AWS s3, и URL S3 сохраняется в базе данных, как показано на рисунке ниже:

введите описание изображения здесь

Сейчас я только что создал Cloudfront Distribution, так как считаю, что это повысит скорость получения изображений. Однако, поскольку URL-адрес Cloudfront автоматически генерируется для любого объекта, загружаемого в мою корзину, URL-адрес S3 необходимо заменить на URL-адрес Cloudfront при обслуживании изображений. И как это сделать?

Я хочу сделать любой вариант 1:

Как будто я думаю, что это можно сделать, создав еще один столбец в db для сгенерированного URL-адреса Cloudfront и потянув его, но я не знаю, как это сделать?

или вариант 2: замените URL-адрес s3 в полученном URL-адресе облачным URL-адресом при извлечении его из базы данных.

Итак, что лучше всего сделать, чтобы заставить его работать? Мне нужна помощь, чтобы переключиться на CloudFront, но мои данные все еще хранятся в корзине S3.

    <?php

include "common.php";
include "aws.php";

try{
if ($_SERVER["REQUEST_METHOD"]=="POST"){
$conn=get_db_connection();
$post_id=$_REQUEST["post_id"];
//$form=R::findOne('answer','id=?',array($form_id));
//$formimage=R::dispense('formimage');
$url="";
if (isset($_FILES["media_file"]) && $_FILES["media_file"]["size"]>0){
$filename=$_FILES["media_file"]["name"];
$fullfilepath="admin/user_media/".$filename;
move_uploaded_file($_FILES["media_file"]["tmp_name"],$fullfilepath);
$emUrl = "http".(!empty($_SERVER['HTTPS'])?"s":"").
"://".$_SERVER['SERVER_NAME'].($_SERVER['SERVER_PORT']=='80'?"":(":".$_SERVER['SERVER_PORT'])).$_SERVER['REQUEST_URI'];
$codeUrl=dirname($emUrl)."/".$fullfilepath;
$url=$codeUrl;

$client = Aws\S3\S3Client::factory(array(
'version' => 'latest',
'region'  => 'us-west-2',
'scheme' => 'http'
));

$pathToFile=$fullfilepath;
$bucket='2sale';

try{
$result = $client->putObject(array(
'ACL' => 'public-read',
'Bucket'     => $bucket,
'Key'        => time().'_'.$filename,
'SourceFile' => $pathToFile
)
);

$stCode=$result['@metadata']['statusCode'];
if ($stCode!="200"){
$result=array("status"=>400,"msg"=>"Error in uploading to s3: ".$stCode);
echo json_encode($result);
exit();
}
$url=$result['ObjectURL'];
unlink($fullfilepath);
}catch(Exception $e){
$result=array("status"=>400,"msg"=>"Exception in s3: ".$e->getMessage());
echo json_encode($result);
exit();
}

$query="INSERT INTO postimage(image_url,post_id) VALUES('".mysql_real_escape_string($url)."',".$post_id.")";
mysql_query($query,$conn);

$query="UPDATE posts SET image_url='".mysql_real_escape_string($url)."' WHERE id=".$post_id;
mysql_query($query,$conn);
}else{
$result=array("status"=>400,"msg"=>"Your image not uploaded to our script");
echo json_encode($result);
exit();
}
mysql_close($conn);
$result=array("status"=>200,"image_url"=>$url,"media_file" => $_FILES["media_file"]);
echo json_encode($result);
exit();
}

}catch(Exception $ex){
$result=array("status"=>400,"msg"=>"Global exception: ".$ex->getMessage());
echo json_encode($result);
exit();
}

?>

<body>
<form method="POST" enctype="multipart/form-data">
<input type="file" name="media_file" />
<input type="text" value="1" name="post_id" />
<input type="submit" value="Submit" />
</form>
</body>

0

Решение

  1. Вы не должны хранить доменное имя S3 или CloudFront в
    база данных. Вам нужно только сохранить полное имя ключа объекта (например,
    /photos/2006/February/sample.jpg). Таким образом, вы всегда можете переключиться
    между S3 ведрами или дистрибутивами CloudFront, просто изменив
    Глобальная переменная конфигурации в вашем приложении, которая содержит
    значение доменного имени.

  2. А еще лучше, вы всегда можете использовать свой собственный
    Альтернативные доменные имена (CNAME) для вашего дистрибутива CloudFront
    с сертификатом SSL от Менеджер сертификатов AWS (например.,
    static.example.com вместо XXXXXXXXXXXXXX.cloudfront.net).
    Таким образом, вам нужно только изменить запись A в вашем DNS, когда
    изменение вашей корзины S3 или дистрибутива CloudFront.

5

Другие решения

Не берите в голову только исправленный это.

В 46 строке или в следующей строке — Добавлено это:

$cloudfront = "https://XXXXX.cloudfront.net/";

$fileNameFull = time().'_'.$filename;

$url = $cloudfront.$fileNameFull;
-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector