2016-11-05 5 views
3

ich Dateien von PHP Upload bucket.its bis s3 Upload erfolgreich, aber wenn ich Bild abrufen erhalte ich folgende Fehlerprivaten s3 Eimer Zugriff auf Dateien

<Error> 
<Code>AccessDenied</Code> 
<Message>Access Denied</Message> 
<Expires>2006-03-09T07:25:20Z</Expires> 
<ServerTime>2016-11-05T04:38:24Z</ServerTime> 

wenn ich öffentlich gesetzt, wenn Dateien dann das Hochladen ich es abrufen kann, aber Ich wollte vor unberechtigten Benutzern schützen.

Upload-Datei Code

try{ 
    $s3 = \Storage::disk('s3'); 
    $filePath = $file->getClientOriginalName(); 
    $s3->put($filePath, file_get_contents($val), 'private'); 

    } catch (Aws\Exception\S3Exception $e) { 
     echo "There was an error uploading the file.\n"+$e; 
    } 

Bevor Frage zu stellen i viele Websites jemals haben, aber es hat nicht geholfen, mir

Amazon S3 see private files

PHP Amazon S3 access private files through URL

How to access Amazon s3 private bucket object through Zend_Service_Amazon_S3

Dritte Verbindung funktioniert für mich, aber

1.ist es sicher, Zugangsschlüssel in URL zu übergeben?

2. ist es möglich, diese Datei für authentifizierte Benutzer anzuzeigen?

public function get_s3_signed_url($bucket, $resource, $AWS_S3_KEY, $AWS_s3_secret_key, $expire_seconds) { 
    $expires = time()+$expire_seconds; 
    // S3 Signed URL creation 
    $string_to_sign = "GET\n\n\n{$expires}\n/".str_replace(".s3.amazonAWS.com","", $bucket)."/$resource"; 
    $signature = urlencode(base64_encode((hash_hmac("sha1", utf8_encode($string_to_sign), $AWS_s3_secret_key, TRUE)))); 

    $authentication_params = "AWSAccessKeyId=".$AWS_S3_KEY; 
    $authentication_params.= "&Expires={$expires}"; 
    $authentication_params.= "&Signature={$signature}"; 
    return $link = "http://s3.amazonAWS.com/{$bucket}/{$resource}?{$authentication_params}"; 
} 
+0

Also, sagen Sie, dass der Upload funktioniert gut, aber Sie sind nicht in der Lage das Objekt zuzugreifen danach? Welche Anmeldeinformationen verwenden Sie, um auf das hochgeladene Objekt zuzugreifen? Haben sie die Erlaubnis, Objekte aus dem Bucket zu lesen? Oh, und ja, es ist vollkommen in Ordnung, eine vorzeichenbehaftete URL zu verwenden - obwohl es den Zugriffsschlüssel zeigt, ist dies ein akzeptables öffentliches Wissen, da die Signatur basierend auf dem geheimen Schlüssel und einem Hash-Algorithmus generiert wird. –

+0

@ JohnRotenstein.using get_s3_signed_url Methode Ich kann auf Dateien zugreifen, aber Problem ist ich Zugriffsschlüssel ist sichtbar für die Öffentlichkeit und vor Ablaufdatum url un authentifizierte Benutzer können dieses Bild oder Datei zu sehen.Wie Sie sagten, der Zugangsschlüssel ist okay.was über authentifizierten Benutzer – iCoders

+0

@JohnRotenstein Vielen Dank für die Info. Jetzt habe ich nur Problem mit dem authentifizierten Benutzer – iCoders

Antwort

1

Hier gibt die Funktion get_s3_signed_url die URL zurück, die den Zugriffsschlüssel hat, und es wird nicht empfohlen. Erstellen Sie eine Funktion, mit der das private Objekt aus dem Bucket abgerufen wird und eine Datei/ein Image lokal auf dem Server erstellt wird. Verwende den Pfad des neu erstellten Bildes und lösche das Bild, wenn du damit fertig bist.

-Code in Zend:

require_once('Zend/Service/Amazon/S3.php'); 

$awsKey = 'your-key'; 
$awsSecretKey = 'your-secret-key'; 

$s3 = new Zend_Service_Amazon_S3($awsKey, $awsSecretKey); 

$bucketName = 'your-bucket-name'; 
$objectName = $bucketName . '/image.jpg'; //image path 

$info = $s3->getInfo($objectName); 

if (is_array($info)) { 
    header('Content-type: ' . $info['type']); 
    header('Content-length: ' . $info['size']); 

    file_put_contents('image.jpg', file_get_contents($s3->getObject($objectName))); 

    header('Content-Description: File Transfer'); 
    header("Content-Disposition: attachment; filename=\"image.jpg\""); 
    header('Content-Transfer-Encoding: binary'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Expires: 0'); 
    ob_clean(); 
    flush(); 
    readfile('image.jpg'); 
    unlink('image.jpg'); 
} else { 
    header('HTTP/1.0 404 Not Found'); 
} 


-Code in Kern php:

require_once('S3.php'); 

$awsKey = 'your-key'; 
$awsSecretKey = 'your-secret-key'; 

$s3 = new S3($awsKey, $awsSecretKey); 

$bucketName = 'your-bucket-name'; 


** To store/download one image at a time** 

$objectName = "image.jpg"; //s3 image path 
$tempFile = "image.jpg"; //temporary/local image path 

$s3->getObject($bucketName, $objectName, $tempFile); //stores the image 

if (filesize($tempFile)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: image/png'); 
    header("Content-Disposition: attachment; filename=\"" . $tempFile . "\""); 
    header('Content-Transfer-Encoding: binary'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Expires: 0'); 
    header('Content-Length: ' . filesize($tempFile)); 
    ob_clean(); 
    flush(); 
    readfile($tempFile); //downloads the image 
    unlink($tempFile); //deletes the image from local 
} 

**To store/download 'n' images at a time** 

$s3ImagesFolder = 'all_images/'; //folder where all the images are 

$bucketContents = $s3->getBucket($bucketName); 

foreach ($bucketContents as $file) { 

if ((strpos($file['name'], $s3ImagesFolder) > -1)) { 
    $tempFile = end(explode("/", $file['name'])); 
    $s3->getObject($bucketName, $file['name'], $tempFile); // to store 

    //to download 
    if ($file['size']) { 
     header('Content-Description: File Transfer'); 
     header('Content-Type: image/png'); 
     header("Content-Disposition: attachment; filename=\"" . $tempFile . "\""); 
     header('Content-Transfer-Encoding: binary'); 
     header('Cache-Control: must-revalidate'); 
     header('Pragma: public'); 
     header('Expires: 0'); 
     header('Content-Length: ' . $file['size']); 
     ob_clean(); 
     flush(); 
     readfile($tempFile); //downloads the image 
     unlink($tempFile); //deletes the image from local 
    } 
    } 
} 
+0

@ Murthy.Thanks.can Sie bieten die Codierung Teil – iCoders

+0

@ Murthy.Ich bin mit Core-PHP nicht zend Framework.Antwort danke, wenn Sie Core-PHP-Code dann teilen und zu einer Zeit habe ich bin retreiving 200 + Bilder Friom s3 bucket.Thanks – iCoders