Estoy tratando de crear un servidor Django que almacene archivos multimedia en S3 donde los usuarios pueden cargar sus propios archivos que pueden tener el mismo nombre de archivo pero ser archivos diferentes. Configuré S3 y lo hice funcionar a través de comandos explícitos de Python como
import boto3 s3 = boto3.resource('s3') s3.Object('my-bucket','text.txt').put(Body=open('/text.txt', 'rb'))Estoy configurando mi modelo así:
import boto3 s3 = boto3.resource('s3') class MyModel(models.Model): my_file = models.FileField() file_url = models.CharField(max_length=200, blank=True, null=True)En mi views.py, mi formulario de carga es:
import boto3 s3 = boto3.resource('s3') ... if form.is_valid(): # creates object from form but doesn't go into database mymodel = form.save(commit=False) uploaded_file = request.FILES['my_file'] s3.Object('my-bucket',uploaded_file.name).put(Body=request.FILES['uploaded_file']) mymodel.file_url = 'http://my-bucket.s3.amazonaws.com/' + uploaded_file.name;Me gustaría que los usuarios carguen sus propios archivos que pueden tener el mismo nombre de archivo pero que sean archivos diferentes. Puedo imaginar generar una cadena md5 y luego agregarla al nombre del archivo, pero luego, cuando las personas vayan a descargar sus archivos, tendrán una cadena hash aleatoria agregada al final del archivo.
Supongo que hay una forma mejor y más elegante de hacer esto. ¿Alguien puede ayudar?
Si es posible, tendría un identificador único para el usuario y cargaría todos los archivos para ese usuario con el identificador adjunto a la URL como una carpeta. Un ejemplo sería si su depósito fuera mybucket y su identificador fuera el ID de usuario, su URL de carga sería ' http://my-bucket.s3.amazonaws.com/ ' + user.Id + '/' + uploaded_file.name . S3 no tiene una estructura de directorios, pero usa prefijos de nombre como una forma de facilitar la organización de sus archivos. A continuación se muestra un enlace a la documentación pertinente: