2014-04-02 15 views
7

Tôi đã viết lại câu hỏi này để làm cho nó rõ ràng hơn, vì tôi đã cập nhật nó.Amazon S3 SDK Các vấn đề về PHP doesObjectExist()

Tôi đang gặp sự cố với SDK PHP Amazon AWS S3. Tôi chỉ đang cố gắng kiểm tra xem một tệp có tồn tại hay không. Sử dụng kịch bản PHP này:

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

?> 

Đây là kết quả:

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

Tôi biết các tập tin tồn tại, nó ở đây:

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

Đây là chính sách IAM cho người dùng có Khóa ID và Khóa Bí mật mà tôi đang sử dụng:

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

Tôi vừa tạo cặp Khóa/Bí mật mới và thêm chúng vào cấu hình của tôi - tôi đã làm gì sai?

Trả lời

2

Tôi tìm thấy câu trả lời trên một SO gửi, trong một bình luận từ Carlos Castillo:

AWS PHP SDK Version 2 S3 filename encoding issue

Ông chỉ cho tôi trong sự chỉ đạo của một Github Issue rằng gợi ý thiết lập khu vực khi khởi client S3, điều này là do tôi đang sử dụng một cá thể S3 ở Ireland cho máy chủ dev của tôi, chứ không phải máy chủ mặc định của Hoa Kỳ.

Vì vậy, đây là giải pháp:

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

đâu AWS_S3_REGION là một tập hợp liên tục trong tập tin cấu hình của tôi, giống như Key và Secret.

tín dụng đi vào neilscastle, Carlos và Stack Overflow cho nó là SEO tuyệt vời

+2

Ah, vị trí thùng là vấn đề có ý nghĩa. –

5

Nếu var_dump() nói bool(false) hoặc bool(true), thì nó trả về giá trị boolean chính xác. print_r() không bao gồm thông tin loại chi tiết và trả về một chuỗi trống cho các giá trị falsenull.

Vậy đối tượng thực sự tồn tại? Những điều cần kiểm tra:

  • Phím S3 không có dấu gạch ngang hàng đầu. Theo mã của bạn và đầu ra ở trên, tôi nghi ngờ đây là vấn đề.
  • Đảm bảo bạn đang cung cấp tên thùng S3 thực tế chứ không phải tên phân phối CloudFront.
  • doesObjectExist() trả về false nếu người dùng không có quyền đọc cho đối tượng đó.
+1

Tôi đã thêm dấu gạch chéo hàng đầu vì nó không hoạt động mà không có, tôi sẽ xóa nó và cập nhật câu hỏi trên cùng và kiểm tra kỹ xem đó có phải là vấn đề hay không. –

+1

Đối với tôi vấn đề là dấu gạch chéo hàng đầu, loại bỏ nó giải quyết nó! – mathielo

2

Ngoài sửa vị trí xô và đọc các điều khoản:

Nếu sử dụng mã hóa server-side bạn cần cung cấp các tùy chọn SSE với doesObjectExist .

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

Tùy chọn SSE bị thiếu hoặc không chính xác sẽ mang lại false trở về từ doesObjectExist.

Các vấn đề liên quan