2017-08-07 6 views
0
にAWS S3から切り替える方法

私は現在、AWS S3バケットにし、S3のURLが示され、以下の画像のようにデータベースに保存されていることを写真をアップロードしています:CloudFrontの

enter image description here

は、今私はちょうどCloudFrontを作成私はそれが画像のレットレイトのスピードを高めると信じて以来、配布。ただし、バケツにアップロードされたオブジェクトに対してCloudfront URLが自動的に生成されるわけではありません。S3 URLは、画像を提供する際にCloudfront URLに置き換える必要があります。

私はオプション1のいずれかやりたい:私はそれが生成さCloudFrontのURLのDB内の別の列を作成し、まだ私はそれを行う方法を知らない、という引っ張っていずれかで行うことができると思うと同様

を?

またはオプション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

これは、すべてのデータベース・テーブルを使用している方法によって異なります。あなたは、文字列置換機能(簡単だがハードコーディングされた)を使用してCloudFront URLを置き換えることができます。あなたが単に意見を求めているだけなので、これは実際プログラミングの質問ではなく、自分の意見だけが重要です。 –

+0

JohnRetenstein:私の上記のコードで何がハードコードされている必要があるのだろうか。 –

答えて

5
  1. あなたは
    データベースにS3またはCloudFrontのドメイン名を保存しないでください。オブジェクトの完全キー名(たとえば、
    /photos/2006/February/sample.jpg)を保存するだけです。このようにして、 ドメイン名の値を含むアプリケーション内の
    グローバル設定変数を変更するだけで、S3バケットまたはCloudFrontディストリビューション間でいつでも を切り替えることができます。

  2. はいっそのこと、あなたは常にAWS Certificate ManagerからSSL証明書を使用してCloudFrontの配信 用に独自の 代替ドメイン名(のCNAME)を使用することができます(例えば、 static.example.com代わりのXXXXXXXXXXXXXX.cloudfront.net)。

    S3バケットまたはCloudFrontディストリビューションを変更するときに、DNSのAレコードを変更するだけで済みます。

-1

ハードコードされていてもかまいません。 46行目で、または次の行に

- これを追加しました:

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

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

$url = $cloudfront.$fileNameFull;