2014-04-02 7 views
7

मैंने इसे स्पष्ट करने के लिए इस प्रश्न को फिर से लिखा है, क्योंकि मैंने इसे अपडेट किया है।अमेज़ॅन एस 3 एसडीके PHP doObjectExist() समस्याएं

मुझे अमेज़ॅन एडब्ल्यूएस एस 3 PHP एसडीके के साथ परेशानी हो रही है। मैं सिर्फ यह जांचने की कोशिश कर रहा हूं कि कोई फ़ाइल मौजूद है या नहीं। इस PHP स्क्रिप्ट का उपयोग करना:

<?php 
    require_once("../../../configs/config.".get_current_user().".php"); 
    require INCLUDES_PATH . 'libraries/aws/aws-autoloader.php'; 

    use Aws\S3\S3Client; 

    $client = S3Client::factory(array(
      'key' => AWS_ACCESS_KEY_ID, 
      'secret' => AWS_SECRET_KEY 
    )); 

    $key = 'profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg'; 
    $result = $client->doesObjectExist(AWS_S3_BUCKET, $key); 

    var_dump(AWS_S3_BUCKET); 
    var_dump($key); 
    var_dump($result); 

?> 

यह आउटपुट है:

string(19) "stage.socialite.app" 
string(59) "profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg" 
bool(false) 

मैं जानता हूँ कि फ़ाइल मौजूद है, यह यहाँ है:

http://stage.socialite.app.s3.amazonaws.com/profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg

इस के लिए IAM नीति है उपयोगकर्ता, जिसका कुंजी आईडी और गुप्त कुंजी मैं उपयोग कर रहा हूं:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": [ 
      "s3:*" 
     ], 
     "Resource": [ 
     "arn:aws:s3:::stage.socialite.app/*", 
     "arn:aws:s3:::stage.socialite.app" 
     ] 
    } 
    ] 
} 

मैंने अभी एक नई कुंजी/गुप्त जोड़ी बनाई है और उन्हें मेरी कॉन्फ़िगरेशन में जोड़ा है - मैंने क्या गलत किया है?

उत्तर

2

मैं Carlos Castillo से एक टिप्पणी में, दूसरे पर जवाब इतना पोस्ट पाया:

AWS PHP SDK Version 2 S3 filename encoding issue

उसने मुझे एक Github Issue कि जब S3 ग्राहक आरंभ क्षेत्र स्थापित करने का सुझाव दिया है की दिशा में इशारा किया, ऐसा इसलिए है क्योंकि मैं आयरलैंड में अपने dev सर्वर के लिए एक S3 उदाहरण का उपयोग कर रहा हूं, डिफ़ॉल्ट यूएस सर्वर नहीं।

तो यह समाधान है:

$client = S3Client::factory(array(
    'key' => AWS_ACCESS_KEY_ID, 
    'secret' => AWS_SECRET_KEY, 
    'region' => AWS_S3_REGION 
)); 

कहाँ AWS_S3_REGION कुंजी और रहस्य की तरह मेरे कॉन्फ़िग फ़ाइल में एक निरंतर सेट, है। आप doesObjectExist साथ SSE विकल्प उपलब्ध कराने की आवश्यकता

सर्वर साइड एन्क्रिप्शन का उपयोग करते हैं:

क्रेडिट neilscastle को जाता है, इसके लिए कार्लोस और स्टैक ओवरफ़्लो बाल्टी स्थान में सुधार करें और अनुमतियों को पढ़ने के लिए उत्कृष्ट एसईओ

+2

आह, समस्या होने वाली बाल्टी स्थान समझ में आता है। –

5

यदि var_dump() कहते हैं bool(false) या bool(true), तो यह सही ढंग से एक बूलियन मान लौटा रहा है। print_r() में विस्तृत प्रकार की जानकारी शामिल नहीं है और false और null मानों के लिए एक खाली स्ट्रिंग देता है।

तो वस्तु वास्तव में मौजूद है? जांचने के लिए:

  • एस 3 कुंजी में एक प्रमुख स्लेश नहीं है। आपके कोड और उपरोक्त आउटपुट के मुताबिक, मुझे संदेह है कि यह समस्या है।
  • सुनिश्चित करें कि आप वास्तविक S3 बाल्टी नाम प्रदान कर रहे हैं, न कि क्लाउडफ्रंट वितरण नाम।
  • doesObjectExist() झूठी रिटर्न देता है यदि उपयोगकर्ता उस ऑब्जेक्ट के लिए पढ़ने की अनुमति नहीं है।
+1

मैंने अग्रणी स्लैश जोड़ा क्योंकि यह बिना काम कर रहा था, मैं इसे हटा दूंगा और शीर्ष प्रश्न अपडेट कर दूंगा, और दोबारा जांच करूँगा कि समस्या नहीं है - मुझे संदेह है कि यह अनुमति समस्या हो सकती है। –

+1

मेरे लिए समस्या प्रमुख स्लैश थी, इसे हल करने से इसे हल किया गया! – mathielo

2

है इसके अलावा ।

$s3Client->doesObjectExist($bucket, $key, array(
    'SSECustomerAlgorithm' => 'AES256', 
    'SSECustomerKey'  => $encryptionKey, 
    'SSECustomerKeyMD5' => md5($encryptionKey, true) 
)); 

गुम या गलत SSE विकल्पों doesObjectExist से false वापसी निकलेगा।