2017-08-07 2 views
0

J'ajout actuellement des photos au seau AWS et que l'URL S3 est enregistrée dans la base de données comme l'image ci-dessous:Comment passer d'AWS s3 à CloudFront

enter image description here

Maintenant, Je viens de créer un CloudFront Distribution depuis je crois que cela va accélérer la vitesse de retreving images. Cependant, pas depuis qu'une URL Cloudfront est générée automatiquement pour tout objet téléchargé dans mon compartiment, l'URL S3 doit être remplacée par l'URL Cloudfront lors de la diffusion des images. Et comment faire?

Je veux faire l'option 1:

Comme je pense que cela peut se faire soit en créant une autre colonne dans db pour l'URL CloudFront généré et de traction qui, encore je ne sais pas comment le faire?

ou l'option 2: Remplacez l'URL s3 de l'URL obtenue par l'URL cloudfront lorsque vous l'extrayez de la base de données.

Alors, quoi de mieux que de le faire fonctionner? J'ai besoin d'aide pour passer à CloudFront mais toujours mes données stockées dans le compartiment 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

Tout dépend de la façon dont vous utilisez la table de base de données. Vous pouvez remplacer l'URL CloudFront à l'aide d'une fonction de remplacement de chaîne (facile, mais codée en dur) ou utiliser l'une ou l'autre de ces options. Ce n'est pas vraiment une question de programmation parce que vous demandez simplement une opinion, et votre opinion est la seule qui compte. –

+0

JohnRetenstein: Je me demande quel code doit être fait dans mon code ci-dessus. –

Répondre

5
  1. Vous ne devriez pas enregistrer le nom de domaine S3 ou CloudFront dans la base de données
    . Vous avez seulement besoin de stocker le nom complet de la clé de l'objet (par exemple,
    /photos/2006/February/sample.jpg). De cette façon, vous pouvez toujours basculer entre des compartiments S3 ou des distributions CloudFront en modifiant simplement une variable de configuration globale dans votre application, qui contient la valeur du nom de domaine .

  2. Mieux encore, vous pouvez toujours utiliser vos propres Autres noms de domaine (CNAMEs) pour votre distribution CloudFront avec un certificat SSL de AWS Certificate Manager (par exemple, au lieu de static.example.comXXXXXXXXXXXXXX.cloudfront.net).
    De cette façon, vous avez seulement besoin de changer l'enregistrement A dans votre DNS lorsque
    changer votre compartiment S3 ou votre distribution CloudFront.

-1

Ne vous occupez pas de le fixer en dur.

En 46 ligne ou dans la ligne suivante - a ajouté:

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

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

$url = $cloudfront.$fileNameFull;