2017-08-24 1 views
1

Ich versuche, Bild/Video mit PHP/Javascript AWS S3AWS Pre unterzeichnet URL

das ist mein PHP-Code

<?php 
use Aws\S3\Exception\S3Exception; 


    $filename = isset($_GET['file']) ? $_GET['file'] : ''; 
    $mime = isset($_GET['mime']) ? $_GET['mime'] : ''; 

    function getSignedUrl($filename, $mime) { 


     require $_SERVER['DOCUMENT_ROOT'].'/ibrainmart/start.php'; 

     $BUCKET = $config['S3']['bucket']; 
     $tmp_name = $filename; 



     try { 
      $command= $S3->getCommand('PutObject', array(
        'Bucket'  => $BUCKET, 
        'Key'   => $tmp_name, 
        'ContentType' => $mime, 
        'Body'  => '' 

      )); 
      $signedUrl = $S3->createPresignedRequest($command, "1 week"); 
     } catch (S3Exception $e) { 
      echo $e->getMessage() . "\n"; 
     } 
     echo $signedUrl->getUri(); 
     return $signedUrl->getUri(); 
    } 


    echo getSignedUrl($filename,$mime); 

?> 

Das ist mein Java Script-Code

$(function(){ 
    // run onLoad 

    $("#profilePic").uploadHandler("headerupload.php"); 
}); 

// Upload image to S3 
$.fn.uploadHandler = function(s3presignedApiUri) 
{ 
    $(document).ready(function (e) { 
     $("#profilePic").on('change',(function(e) { 
     e.preventDefault(); 

     console.log("ajax going to start..!"); 
     var fileupload = $('input[name=file]'); 
     var fileToUpload = fileupload[0].files[0]; 
      if(fileToUpload !="undefined"){ 
      var formData = new FormData(); 
      formData.append("file", fileToUpload); 
      } 
     console.log("fileToUpload.name"+fileToUpload.name); 
     $.ajax({ 
       url: s3presignedApiUri, // Url to which the request is send 
       type: "GET",    // Type of request to be send, called as method 

       data: 'file='+ fileToUpload.name + '&mime=' + fileToUpload.type , // Data sent to server, a set of key/value pairs (i.e. form fields and values) 


       cache: false,    // To unable request pages to be cached 
       })  


       .done(function(data) // A function to be called if request succeeds 
       { 

        console.log("data ............"+data); 

        $.ajax({ 
         url : data.url, 
         type : "PUT", 
         data : fileToUpload, 
         cache : false, 
         contentType : fileToUpload.type, 
         processData : false 
        }) 
        .done(function() { 

         console.info("s3-upload done: "); // REMOVE ME FOR PRODUCTION USE 

        }) 
        .fail(function(e) { 
         console.error("s3-upload failed",e); // REMOVE ME FOR PRODUCTION USE 
        }); 
       }) 
       .fail(function(e) 
         { 
         console.log("file passing error.!"); 
        }) 

       })); 

    }); 


} 
hochladen

Alle diese Funktionen funktionieren großartig, ich denke, auch nach dem Ausführen gibt es mir Datei Upload erfolgreich Nachricht zu.aber wenn ich s3 überprüfen, ist nichts da.

sogar in der Konsole es die Presignrd URL wie unten zu generieren.aber wenn ich versuche, klicken Sie es gibt mir SignatureDoesNotMatch Fehler. (Bitte klicken Sie auf die URL). Was könnte der Fehler ..?

https://ibrainmartstorage.s3.us-east-2.amazonaws.com/DSC_1595.JPG?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJZBWQOXKKPC7UXDQ%2F20170824%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20170824T062933Z&X-Amz-SignedHeaders=host&X-Amz-Expires=604800&X-Amz-Signature=a4384c737f191c6a516611f67a322ebf98b8e9e0aff65bbcd84e74c87637fb3dhttps://ibrainmartstorage.s3.us-east-2.amazonaws.com/DSC_1595.JPG?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJZBWQOXKKPC7UXDQ%2F20170824%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20170824T062933Z&X-Amz-SignedHeaders=host&X-Amz-Expires=604800&X-Amz-Signature=a4384c737f191c6a516611f67a322ebf98b8e9e0aff65bbcd84e74c87637fb3d

+0

Siehe die folgende Dokumentation https://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-presigned-post.html und prüfen, ob seine Arbeits? – Ashan

Antwort

1

Nach dem Versuch, diese Lösung gefunden Tage.

Verwenden Sie AWS Cognito Federate-Pools zum Generieren einer Sitzung für AWS S3 und Hochladen von Dateien mit dem temporär generierten Secret-Schlüssel, accessID und Session.below i aufgelistetem Codebeispiel dafür.

getAuthenticateUser().getSession(function(err,session){ 
    if (err) { 
     console.log("Error"+err); 
     return; 
    } 
    if(session.isValid()) 
    { 

     const authenticator = 'cognito-idp.us-east-2.amazonaws.com/us-east-2_cfmOv3jSL'; 
     AWS.config.region = 'us-east-2'; // Region 
     AWS.config.credentials = new AWS.CognitoIdentityCredentials({ 
     IdentityPoolId: 'us-east-2:XXXXX-d2b7-XXXX-85c7-929aadf450b2', 
     Logins: { 
      [authenticator]: session.getIdToken().getJwtToken() 
      } 

    }); 
    AWS.config.credentials.refresh((error) => { 
     if (error) { 
      console.error(error); 
     } else { 
      console.log('Successfully logged!'); 
     } 
    }); 


    AWS.config.getCredentials(function(err) { 
     if (err) console.log(err.stack); // credentials not loaded 
     else { 
     console.log("Access Key:", AWS.config.credentials.accessKeyId); 
     console.log("Access Key:", AWS.config.credentials.secretAccessKey); 
    console.log("Access Key:", AWS.config.credentials); 

    AWS.config.update({ 
     AccessKeyId : AWS.config.credentials.AccessKeyId, 
     SecretAccessKey : AWS.config.credentials.SecretAccessKey , 
     SessionToken : AWS.config.credentials.SessionToken 

    }); 
     } 

    }); 
    } 

    if(!session.isValid()) 
    { 
     console.log("Session is not valid..!"); 
     //Please Login to Continue 
    } 

    });