2017-05-22 5 views
0

J'ai exactement la même question que this question mais mon code génère l'erreur suivante lorsque je test en Postman:Création d'Amazon S3 presigned URL pour l'accès public de Ruby on Rails

AccessDenied Il y avait des têtes présents dans la demande qui étaient pas signé.

enter image description here

C'est le code Ruby qui crée l'url:

require 'aws-sdk' 
class Api::AmazonController < ApiController 
    before_action :set_credentials 

    def presign 
    if params[:filename] # && params[:type] 
     s3 = Aws::S3::Resource.new(region:'eu-west-2') 
     bucket = Rails.application.secrets.s3_bucket_name.to_s 
     obj = s3.bucket(bucket).object(params[:filename]) 
     url = obj.presigned_url(:put, acl:'public-read') #, content_type: params[:type], expires: 10*60) 
     render json: url 
    else 
     render json: { error: 'Invalid params' } 
    end 
    end 

    private 

    def set_credentials 
     Aws.config[:credentials] = Aws::Credentials.new(Rails.application.secrets.aws_access_key_id, Rails.application.secrets.aws_secret_access_key) 
     # Aws.config.update({region: 'eu-west-2'}) 
    end 
end 

Si je retire l'en-tête x-amz-acl du code Ruby:

url = obj.presigned_url(:put) 

Ensuite, il fonctionne et je peux mettre un fichier. Alors qu'est-ce qui me manque?

+0

Essayez obj.presigned_url (: get, expires_in: 4600) –

+0

@HardikUpadhyay Merci, mais la valeur par défaut est de 15 min. J'ai essayé avec et sans expires_in, aucune différence. J'ai besoin de la lecture publique pour que tout le monde puisse voir le fichier. – rmcsharry

Répondre

0

La solution est de ne pas ajouter l'en-tête dans Postman. En le laissant dans le code ruby ​​et en supprimant le paramètre 'x-amz-acl' de Postman, le problème a été résolu.