6

Sto utilizzando signed authorized S3 uploads in modo che gli utenti possano caricare i file direttamente dal browser su S3 ignorando il mio server. Al momento funziona, ma il nome del file è lo stesso del computer dell'utente. Mi piacerebbe salvarlo su S3 come nome diverso.Invio di file direttamente dal browser a S3 ma modifica del nome del file

Il formdata ho posto ad Amazon si presenta così:

var formData = new FormData(); 
formData.append('key', targetPath);      // e.g. /path/inside/bucket/myFile.mov 
formData.append('AWSAccessKeyId', s3Auth.AWSAccessKeyId); // aws public key 
formData.append('acl', s3Auth.acl);      // e.g. 'public-read' 
formData.append('policy', s3Auth.policy);     // s3 policy including ['starts-with', '$key', '/path/inside/bucket/'] 
formData.append('signature', s3Auth.signature);   // base64 sha1 hash of private key and base64 policy JSON 
formData.append('success_action_status ', 200);   // response code 200 on success 
formData.append('file', file.slice());     // e.g. /path/on/user/computer/theirFile.mov 

Tuttavia al posto del file fino a raggiungere: https://s3.amazonaws.com/mybucket/path/inside/bucket/myFile.mov

Si finisce come: https://s3.amazonaws.com/mybucket/path/inside/bucket/theirFile.mov

Nota ha il loro nome file ma il mio percorso di base.

Mi piacerebbe che avesse anche il nome file che ho specificato.

AGGIORNAMENTO: Aggiornamento: questo funzionava da sempre Avevo semplicemente un altro codice copiato da un bucket all'altro che ripristinava il nome del file originale e mi confondeva.

risposta

4

Sei sicuro del contenuto di targetPath e da dove provengono i dati?

Il comportamento che si sta descrivendo è quello che dovrebbe accadere in un caso particolare in cui targetPath non contiene effettivamente /path/inside/bucket/myFile.mov.

Vorrei suggerire che targetPath contiene in realtà il valore /path/inside/bucket/${filename} - e con questo voglio dire, letteralmente, i personaggi $ { f i l e n a m e } sono alla fine della stringa, invece del nome del file che si intende.

Se è vero, è esattamente come dovrebbe funzionare.

Se non si conosce il nome del file di un utente caricherà, il valore della chiave può includere la variabile speciale ${filename} che sarà sostituito con il nome del file caricato. Ad esempio, il valore chiave uploads/${filename} diventerà il nome dell'oggetto uploads/Birthday Cake.jpg se l'utente carica un file denominato Birthday Cake.jpg.

https://aws.amazon.com/articles/1434

Se si popolano quella variabile con il nome letterale che si desidera vedere in S3, allora i caricamenti dovrebbero comportarsi come ci si aspetta, utilizzando il nome del file al posto del nome del file sul computer del Uploader .


Inoltre, un approccio più sicuro sarebbe quello di eliminare la chiave 'starts-with' logica nella vostra politica, e invece firmare esplicitamente una politica (dinamico) per ogni evento caricati, con la chiave specifica che si desidera all'utente di caricare. Altrimenti, non è impossibile sfruttare questo modulo per sovrascrivere altri file all'interno dello stesso prefisso chiave.

+0

Il mio problema è che voglio dare un nome al file qualcosa di diverso, indipendentemente dal nome del file che l'utente carica. – Zugwalt

+0

@Zugwalt right ...questo è il motivo per cui ciò che il tuo codice inserisce in "targetPath" deve terminare con il nome file letterale che vuoi vedere in S3, non "$ {filename}", che è quello che * penso * stai facendo ora, in base al tuo comportamento stiamo vedendo. –

+0

'targetPath' in questo momento è il percorso letterale, ad esempio'/percorso/interno/bucket/myFile.mov'. Non usare affatto $ {nomefile} '. Anche preso il tuo suggerimento e nella policy invece di usare 'starts-with', ora uso solo il tasto'. Ancora senza fortuna. – Zugwalt