Endpoint per caricare file su bucket S3 (amazon)

8 views
Skip to first unread message

Karim

unread,
Jul 17, 2018, 7:10:09 AM7/17/18
to Django Italia
Salve a tutti, devo creare un endpoint (DRF) per permettere al client di caricare files su S3.

Ho capito che devo creare una policy per il client che allegera' al post per mandare il file su S3. Ho seguito questi due link per prendere spunto:

Documentazione AWS:

Esempio su django:

Io ho preso spunto, ma mi sto chiedendo se ha davvero senso avere una rappresentazione del file S3 nel database. Mi spiego meglio, potrei creare un model che rappresenta un file su S3 e che viene associato (GenericForeignKey) al Model che vuole gestire dei file (User, Document...). Il problema di questa soluzione e' che devo wrappare ogni cosa che viene fatta sul file. Rename, delete, upload... tutto deve passare con un update del database.

Mi chiedevo invece se non aveva piu' senso dare l'accesso al client ad una directory s3 che appartiene all'oggetto 'proprietario' dei files. Io come id uso un uuid e quindi potrei tranquillamente farlo, in questo modo se voglio sapere quali file ha il modello, mi basta solo accedere alla path data dall'id su s3. In questo modo mi tolgo persino il database dalle scatole.

Cosa ne pensate?

Ciao

--
Karim N. Gorjux

Patrick Arminio

unread,
Jul 17, 2018, 7:30:44 AM7/17/18
to Django Italia
Dipende anche da cosa devi caricare, in passato ho avuto bisogno di caricare video abbastanza pesanti (anche qualche GB) su s3, la soluzione che abbiamo adottato (e che ora usiamo sempre)
è stata quella di creare un URL firmato (https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html) e far fare tutto il resto al frontend[1].
Nella funzione che crea l'url di solito creiamo una chiave univoca e salviamo quella sul db, il bucket è una configurazione alla fine :)
Creare un modello per i file secondo me è un po' un overkill, al massimo farei un field custom per gestire alcuni casi particolari :)


[1] a dire il vero era un po' più complicato di così, abbiamo usato questa libreria per caricare i file dividendolo in più pezzi: https://github.com/TTLabs/EvaporateJS
ma il principio è lo stesso.
Reply all
Reply to author
Forward
0 new messages