2013-08-20 38 views
5

Tôi đang cố sử dụng tính năng mới của FineUploader cho phép tải trực tiếp lên amazon s3. Hiện tại, tôi không thể tải ảnh lên. Tôi gặp lỗi: "Tài liệu chính sách không hợp lệ hoặc các tiêu đề yêu cầu!"Nhận tài liệu chính sách không hợp lệ hoặc yêu cầu lỗi tiêu đề khi sử dụng trình tải lên cho amazon s3

Các nhà phát triển đã đặt câu hỏi được đăng tại đây tại stackoverflow.

Tôi theo hướng dẫn của họ trên trang này:

http://blog.fineuploader.com/2013/08/16/fine-uploader-s3-upload-directly-to-amazon-s3-from-your-browser/#guide

Trong thiết lập mọi thứ lên, tôi cũng đã mô phỏng các tập tin ví dụ liên quan đến đó: https://github.com/Widen/fine-uploader-server/blob/master/php/s3/s3demo.php

Tôi đã javascript tôi thiết lập do đó có rất ít tùy chọn:

$('#fineuploader-s3').fineUploaderS3({ 
      request: { 
       endpoint: "http://thenameofmybucket.s3.amazonaws.com", 
       accessKey: “mypublicaccesskey” 
      }, 

      signature: { 
       endpoint: "s3demo.php" 
      }, 

      iframeSupport: { 
       localBlankPagePath: "/success.html" 
      }, 

     cors: { 
       expected: true 
      } 
    }); 

Tôi biết có rất nhiều p ren nơi mà điều này có thể đã đi sai cho tôi. Tôi chưa bao giờ sử dụng s3 hoặc fineuploader trước đây, vì vậy xin lỗi nếu đây là những câu hỏi câm. Nhưng đây là những nơi mà tôi cảm thấy bối rối nhất trong việc thiết lập. Tôi có cảm giác vấn đề nằm ở # 1:

(1) Trong ví dụ javascript, đây là cách đường dẫn đến chữ ký được thiết lập:

// REQUIRED: Path to our local server where requests can be signed. 
      signature: { 
     endpoint: "/s3/signtureHandler" 
      }, 

Tôi đã không chắc chắn nếu điều đó có nghĩa là là một tệp rỗng, nơi một số json được tạo ra hoặc nếu nó được cho là trỏ đến tập lệnh php, nơi hàm tạo json, trong trường hợp của tôi là s3demo.php, mà tôi đã sao chép trực tiếp.

(2) Trong tập tin s3demo.php, các đường duy nhất mà tôi đã thay đổi là những:

$clientPrivateKey = $_SERVER['I put my private key here']; 

$expectedBucket = "http://thenameofmybucket.s3.amazonaws.com"; 

function handlePreflightedRequest() { 
    // If you are relying on CORS, you will need to adjust the allowed domain here. 
    header('Access-Control-Allow-Origin: http://mywebsitename.org'); 
} 

(3) Đây là những gì tôi có cho file CORS của tôi, tôi đã không chắc chắn nếu nó là đúng vì các ví dụ trên trang hướng dẫn này không bao gồm các thẻ:

<CORSRule> 
     <AllowedOrigin>http://mywebsitename.org</AllowedOrigin> 
     <AllowedMethod>POST</AllowedMethod> 
     <MaxAgeSeconds>3000</MaxAgeSeconds> 
     <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 

(4) Như đã trình bày trong các hướng dẫn, tôi đã đi vào bảng điều khiển IAM và tạo ra một nhóm với chủ trương sao chép từ các hướng dẫn chính xác, nhưng với tên thực tế của nhóm của tôi:

{ 
    "Version":"2012-10-17", 
    "Statement":[{ 
    "Effect":"Allow", 
    "Action":"s3:PutObject", 
    "Resource":"arn:aws:s3:::thenameofmybucket/*” 
    }] 
} 

, sau đó là người dùng mà tôi đã nhận được khóa truy cập công khai và riêng tư được sử dụng trong tệp javascript và php tương ứng. Tên người dùng không được sử dụng cụ thể ở bất kỳ đâu trong tập lệnh.

Tôi hy vọng có điều gì đó thực sự rõ ràng rằng tôi đã làm sai ở đây. Cảm ơn vì đã dành thời gian cho tôi.

+1

Để trả lời câu hỏi (1). Tùy chọn 'signature.endpoint' sẽ trỏ đến tập lệnh php. –

Trả lời

2

Nếu tôi hiểu chính xác, bạn đang nhìn thấy phía máy khách thư "Tài liệu chính sách không hợp lệ ..." khi cố gắng ký yêu cầu tải lên đơn giản. Bạn cũng đang sử dụng ví dụ phía máy chủ PHP được cung cấp s3demo.php.

Vấn đề lớn nhất tôi thấy với các thay đổi của bạn là biến số $expectedBucket. Nhóm của bạn không phải là "http://thenameofmybucket.s3.amazonaws.com", đó là "thenameofmybucket". Rất có thể, mã phía máy chủ đang từ chối chính sách vì nó đang mong đợi một nhóm có tên "http://thenameofmybucket.s3.amazonaws.com" khi tôi chắc chắn rằng nhóm của bạn thực tế có tên "thenameofmybucket". Thay đổi dòng đó thành $expectedBucket = "thenameofmybucket";.

Ngoài ra, không rõ nơi bạn đang lưu trữ khóa bí mật phía máy khách, dựa trên câu hỏi của bạn. Nếu khóa bí mật của bạn là "12345", bạn có dòng mã trông như thế này không?

$clientPrivateKey = $_SERVER['12345'];

Nếu vậy, đây là vấn đề khác với mã phía máy chủ của bạn. $_SERVER superglobal trong PHP đang tìm biến môi trường có tên "12345", có lẽ, chứa khóa bí mật của bạn. Nếu bạn chưa thiết lập một biến như vậy, thì hãy làm như vậy, hoặc, có lẽ, chỉ cần đặt giá trị $clientPrivateKey thành khóa bí mật của bạn.

Ngoài ra, bạn có thực sự đang làm việc trong môi trường có nguồn gốc chéo ở đây không? Nó không giống như bạn. Nếu vậy, bạn không cần bất kỳ nội dung nào được đánh dấu "CORS" hoặc "cross-origin" hoặc "cross-domain" trong ví dụ PHP.

UPDATE:
Bạn cũng nên thiết lập các $expectedMaxSize toàn cầu để null nếu bạn không cài đặt bất kỳ hạn chế kích thước giới hạn về tải lên. Chúng tôi đang cập nhật PHP example for Fine Uploader S3 ngay bây giờ với một số cải tiến và giải thích sẽ giúp những người khác trong tương lai.

+0

Cảm ơn bạn đã đánh bắt tất cả các lỗi đó. Tôi đã thay đổi $ expectedBucket và cố định dòng mã bằng khóa của tôi. Nhưng tôi vẫn nhận được cùng một lỗi, vì vậy tôi đoán có cái gì đó khác là sai. –

+0

@EBlair Mọi thứ có hoạt động không? –

+0

Cảm ơn bạn đã hỏi - rất tiếc, không. Tôi có cần phải loại bỏ một số mã liên quan đến CORS từ ví dụ php không? –

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