Php 如何从AWS s3切换到Cloudfront

Php 如何从AWS s3切换到Cloudfront,php,amazon-web-services,amazon-s3,amazon-cloudfront,Php,Amazon Web Services,Amazon S3,Amazon Cloudfront,我目前正在将照片上传到AWS s3 bucket,s3 URL正在数据库中保存,如下图所示: 现在我刚刚创建了一个Cloudfront发行版,因为我相信它将提高检索图像的速度。然而,不是因为上传到我的bucket的任何对象都会自动生成Cloudfront URL,所以在提供图像时需要将S3 URL替换为Cloudfront URL,以及如何做到这一点 我想选择其中一个选项1: 就像我认为可以通过在db中为生成的Cloudfront URL创建另一列并拉取该列来完成一样,但我仍然不知道如何做 或

我目前正在将照片上传到AWS s3 bucket,s3 URL正在数据库中保存,如下图所示:

现在我刚刚创建了一个Cloudfront发行版,因为我相信它将提高检索图像的速度。然而,不是因为上传到我的bucket的任何对象都会自动生成Cloudfront URL,所以在提供图像时需要将S3 URL替换为Cloudfront URL,以及如何做到这一点

我想选择其中一个选项1:

就像我认为可以通过在db中为生成的Cloudfront URL创建另一列并拉取该列来完成一样,但我仍然不知道如何做

或者选项2:从数据库中提取时,将获取的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>

  • 您不应该将S3或CloudFront域名存储在
    数据库您只需要存储对象的完整密钥名(例如,
    /photos/2006/二月/sample.jpg
    )。这样,您就可以随时切换 只需修改一个
    应用程序中的全局配置变量,其中包含 域名值

  • 更好的是,你可以随时使用你自己的 CloudFront发行版的备用域名(CNAMEs) 具有来自(例如。,
    static.example.com
    而不是
    xxxxxxxxxxxx.cloudfront.net
    )。
    这样,当
    更改S3 bucket或CloudFront发行版

  • 您不应该将S3或CloudFront域名存储在
    数据库您只需要存储对象的完整密钥名(例如,
    /photos/2006/二月/sample.jpg
    )。这样,您就可以随时切换 只需修改一个
    应用程序中的全局配置变量,其中包含 域名值

  • 更好的是,你可以随时使用你自己的 CloudFront发行版的备用域名(CNAMEs) 具有来自(例如。,
    static.example.com
    而不是
    xxxxxxxxxxxx.cloudfront.net
    )。
    这样,当
    更改S3 bucket或CloudFront发行版


  • 没关系,只要把它硬编码就行了

    在第46行或下一行-添加以下内容:

    $cloudfront = "https://XXXXX.cloudfront.net/";
    
    $fileNameFull = time().'_'.$filename;
    
    $url = $cloudfront.$fileNameFull; 
    

    没关系,只要把它硬编码就行了

    在第46行或下一行-添加以下内容:

    $cloudfront = "https://XXXXX.cloudfront.net/";
    
    $fileNameFull = time().'_'.$filename;
    
    $url = $cloudfront.$fileNameFull; 
    

    这完全取决于您如何使用数据库表。您可以使用字符串替换函数(简单但硬编码)替换CloudFront URL,或者执行您声明的任一选项。这不是一个真正的编程问题,因为你只是在征求意见,而你的意见是唯一重要的。约翰伦斯坦:想知道在我上面的代码中需要做什么硬编码。这完全取决于你如何使用数据库表。您可以使用字符串替换函数(简单但硬编码)替换CloudFront URL,或者执行您声明的任一选项。这并不是一个真正的编程问题,因为你只是在征求意见,而你的意见是唯一重要的。约翰伦斯坦:想知道在我上面的代码中需要做什么硬编码。