2017-08-07 1 views
0

ich zur Zeit Fotos zu AWS S3-Bucket Hochladen und S3 URL unten in der Datenbank, wie dargestellt Bild gespeichert wird:Wie aus AWS S3 Cloudfront wechseln

enter image description here

Nun Ich habe gerade eine Cloudfront Die Distribution, da ich glaube, dass sie die Geschwindigkeit des Returens von Bildern erhöht. Da jedoch für jedes Objekt, das in meinen Bucket hochgeladen wird, automatisch eine Cloudfront-URL generiert wird, muss die S3-URL bei der Bereitstellung der Bilder durch die URL von Cloudfront ersetzt werden. Und wie geht das?

ich entweder Option tun mag 1:

Wie ich es denke, entweder durch eine andere Spalte in db für die generierte URL Cloudfront zu schaffen und zieht das getan werden kann, noch ich weiß nicht, wie es zu tun?

oder Option 2: Ersetzen Sie die s3-URL in der erhaltenen URL durch die Cloudfront-URL, wenn Sie sie aus der Datenbank ziehen.

Also was am besten zu tun, um es funktionieren zu lassen? Ich brauche Hilfe, um zu CloudFront wechseln, aber immer noch meine Daten in S3 Bucket gespeichert.

<?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

Es hängt alles davon ab, wie Sie die Datenbanktabelle verwenden. Sie können die CloudFront-URL durch eine String-Ersetzungsfunktion ersetzen (einfach, aber fest codiert) oder eine der Optionen verwenden, die Sie angegeben haben. Das ist nicht wirklich eine Programmierfrage, weil Sie einfach um eine Meinung bitten, und nur Ihre Meinung zählt. –

+0

JohnRetenstein: Wunder, was hardcoded in meinem obigen Code getan werden muss. –

Antwort

5
  1. Sie sollten die S3 oder Cloudfront Domänennamen in der
    Datenbank nicht gespeichert werden. Sie müssen nur den vollständigen Schlüsselnamen des Objekts speichern (z. B.
    /photos/2006/February/sample.jpg). Auf diese Weise können Sie immer zwischen S3-Buckets oder CloudFront-Distributionen wechseln, indem Sie nur eine globale
    Variable in Ihrer Anwendung ändern, die den Domänennamen enthält.

  2. Noch besser wäre es, Sie können jederzeit Ihren eigenen Alternativen Domain-Namen verwenden (CNAMEs) für Ihre Cloudfront Verteilung mit einem SSL-Zertifikat von AWS Certificate Manager (zum Beispiel static.example.com statt XXXXXXXXXXXXXX.cloudfront.net).
    Auf diese Weise müssen Sie nur den A-Eintrag in Ihrem DNS ändern, wenn
    Ihre S3-Bucket- oder CloudFront-Verteilung ändert.

-1

Es macht nichts, nur repariert es fest codiert.

In 46 Zeilen oder in der nächsten Zeile - Hinzugefügt dies:

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

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

$url = $cloudfront.$fileNameFull;