我目前正在将照片上传到亚马逊网络服务s3存储桶中,该S3地址保存在数据库中,如下图所示:
现在我刚刚创建了一个Cloudfront发行版,因为我相信它会提高图像检索的速度。然而,不是因为上传到我的存储桶的任何对象都会自动生成Cloudfront URL,所以在提供图像时需要将S3 URL替换为Cloudfront URL,该如何做?
我想做选项1中的任何一个:
就像我认为它可以通过在db中为生成的Cloudfront URL创建另一个列并拉出它来完成,但我仍然不知道怎么做?
或者选项二:从数据库拉取时,将获取到的URL中的s3 URL替换为cloudfront 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>
发布于 2017-08-07 05:42:09
数据库。您只需要存储对象的完整密钥名称(例如,
/photos/2006/February/sample.jpg
)。这样,您就可以随时在S3存储桶或CloudFront发行版之间切换,只需修改
static.example.com
而不是XXXXXXXXXXXXXX.cloudfront.net
)一起用于您的CloudFront分发。这样,您只需在以下情况下更改DNS中的A记录
更改您的S3存储桶或CloudFront分发。
发布于 2017-08-07 06:47:52
不要紧,只要硬编码就行了。
在46行或下一行-添加了以下内容:
$cloudfront = "https://XXXXX.cloudfront.net/";
$fileNameFull = time().'_'.$filename;
$url = $cloudfront.$fileNameFull;
https://stackoverflow.com/questions/45539700
复制相似问题