В настоящее время я загружаю фотографии в корзину 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>
Вы не должны хранить доменное имя S3 или CloudFront в
база данных. Вам нужно только сохранить полное имя ключа объекта (например,
/photos/2006/February/sample.jpg
). Таким образом, вы всегда можете переключиться
между S3 ведрами или дистрибутивами CloudFront, просто изменив
Глобальная переменная конфигурации в вашем приложении, которая содержит
значение доменного имени.
А еще лучше, вы всегда можете использовать свой собственный
Альтернативные доменные имена (CNAME) для вашего дистрибутива CloudFront
с сертификатом SSL от Менеджер сертификатов AWS (например.,
static.example.com
вместо XXXXXXXXXXXXXX.cloudfront.net
).
Таким образом, вам нужно только изменить запись A в вашем DNS, когда
изменение вашей корзины S3 или дистрибутива CloudFront.
Не берите в голову только исправленный это.
В 46 строке или в следующей строке — Добавлено это:
$cloudfront = "https://XXXXX.cloudfront.net/";
$fileNameFull = time().'_'.$filename;
$url = $cloudfront.$fileNameFull;