2015-06-05 3 views
0

Im разрабатывает веб-приложение, из которого Id нравится загружать файлы на Amazon S3, используя предварительно подписанный пост. Следуя инструкциям по этой ссылке: http://aws.amazon.com/articles/1434 У меня есть следующая форма.Загрузить файл amazon s3 pre signed post

<form action=<%= @aws_s3_url %> method="post" enctype="multipart/form-data"> 
     <input type="hidden" name="key" value= <%= @base_path + "${filename}" %> > 
     <input type="hidden" name="AWSAccessKeyId" value= <%= @aws_access_key_id %> > 
     <input type="hidden" name="acl" value="private"> 
     <input type="hidden" name="success_action_redirect" value=<%= "https://localhost:3000/projects/" + @project.id.to_s %> > 
     <input type="hidden" name="policy" value= <%= @aws_policy %>> 
     <input type="hidden" name="signature" value=<%= @aws_signature %>> 
     <!-- Include any additional input fields here --> 

     File to upload to S3: 
     <input name="file" type="file"> 
     <br> 
     <input type="submit" value="Upload File to S3"> 
    </form> 

где @aws_s3_url = "https://s3-eu-west-1.s3.amazonaws.com/my_bucket"

Политика генерируется с помощью этого метода:

def generate_policy_pre_signed_post(key) 
    policy = "{ \"expiration\": \"#{Time.now.tomorrow.utc.iso8601}\"," 
    policy +="\"conditions\": [" 
    policy += "{\"acl\": \"private\" }," 
    policy += "{\"success_action_redirect\": \"https://localhost:3000/projects/#{@project.id.to_s}\"}," 
    policy += "{\"bucket\": \"my_bucket\" }," 
    policy += "[\"starts-with\", \"$key\", \"#{key}\"],]}" 

    policy 
end 

И затем кодируется и подписан как в ссылке выше: политики = generate_policy_pre_signed_post ("/ users_data /" + user_creds.aws_identity_id + "/")

@aws_policy = Base64.encode64(policy).gsub("\n","") 

@aws_signature = Base64.encode64(
    OpenSSL::HMAC.digest(
     OpenSSL::Digest::Digest.new('sha1'), 
     server_credentials.secret_access_key, @aws_policy) 
).gsub("\n","") 

Но когда я пытаюсь загрузить файл на S3, он дает следующую ошибку: «Указанный метод не разрешен против этого ресурса».

Как это может быть? В IAM мой пользователь имеет все разрешения на запись в S3, и Ive также попытался добавить политику ведро, как это:

{ 
"Version": "2012-10-17", 
"Statement": [ 
    { 
     "Sid": "statement1", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": "arn:aws:iam::my_iam" 
     }, 
     "Action": [ 
      "s3:PutObject" 
     ], 
     "Resource": [ 
      "arn:aws:s3:::my_bucket/*" 
     ] 
    } 
] 
} 

Любые идеи о том, что может происходить?

EDIT: ив также попытался изменения разрешения CORS (и по-прежнему не работает)

<CORSRule> 
    <AllowedOrigin>https://0.0.0.0:3000/*</AllowedOrigin> 
    <AllowedMethod>GET</AllowedMethod> 
    <AllowedMethod>POST</AllowedMethod> 
    <AllowedMethod>PUT</AllowedMethod> 
    <MaxAgeSeconds>3000</MaxAgeSeconds> 
    <AllowedHeader>*</AllowedHeader> 
</CORSRule> 

ответ

0

Ok, я нашел его! это было глупо, у меня был дополнительный s3 в s3-eu-west-1.s3.amazonaws.com/my_bucket, правильный путь: s3-eu-west-1.amazonaws.com/my_bucket

Смежные вопросы