Sto creando un'API per un servizio di back-end con Rails 4. Il servizio deve caricare un file immagine in un bucket amazon s3.Ottenere l'URL di posta preimpostata S3 con parametri di query per un client mobile
Desidero utilizzare un URL di caricamento diretto, in modo che i client gestiscano i caricamenti su s3 e il server non sia occupato.
Attualmente ho il seguente prototipo rotaie azione
def create
filename = params[:filename]
s3_direct_post = S3_BUCKET.presigned_post(key: "offers/#{SecureRandom.uuid}/#{filename}", acl: 'public-read')
s3p = s3_direct_post.fields
url = "#{s3_direct_post.url}/#{filename}?X-Amz-Algorithm=#{s3p['x-amz-algorithm']}&X-Amz-Credential=#{s3p['x-amz-credential']}&X-Amz-Date=#{s3p['x-amz-date']}&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=#{s3p['x-amz-signature']}"
render json: {success: true, url: url}, status: :ok
end
Questo genera un tale url:
https://my-bucket.s3.eu-central-1.amazonaws.com/test.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=MYKEY/20150420/eu-central-1/s3/aws4_request&X-Amz-Date=20150420T162603Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=MYSIGNATURE
Ora cerco di pubblicare il test.png a questo URL con il seguente:
curl -v -T test.png "url"
e ottengo il seguente ng risposta di errore:
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>MYKEY</AWSAccessKeyId>...
Credo che il problema deriva dal fatto, che il specificata X-Amz-SignedHeaders intestazione è sbagliata. Non sono sicuro di quali intestazioni vengano utilizzate di default dalla gemma sdk di amazon rails.
Come dovrei cambiare la mia generazione di URL, in modo che un client mobile possa semplicemente prendere l'url e inviare un file ad esso?
'Ok nessuno sembra preoccuparsi this' ... Con così che è quasi mai il caso :) . Avevo bisogno di accedere alle mie credenziali postate sul lato server da un client mobile ed ero un po 'confuso fino a quando non mi sono imbattuto in questo. Grazie. – divergent
Sì, è fantastico. Voglio solo aggiungere che sebbene sia stata fatta la domanda riguardante aws-sdk versione 1, questa soluzione è appropriata per aws-sdk versione 2 (si noti che Aws :: S3 :: Resource.new in questa soluzione utilizza * Aws *, non * AWS * - La versione 2 di sdk utilizza * Aws *. Documenti e esempi in particolare per la versione 2 di sdk sono difficili da trovare, quindi grazie per questo –
Ho dovuto cambiare i nomi delle variabili da maiuscolo a maiuscolo per evitare una dinamica comunque, errore di assegnazione costante –