In meiner Django App, Ich möchte Upload Pfad und Datei dynamisch beim Speichern in AWS S3 definieren. Ich kann die Datei direkt in S3 speichern, aber ich möchte den Pfad und Dateinamen selbst festlegen.django aws S3 Datei Pfad und Datei dynamisch definieren
So zum Beispiel beim Hochladen mag ich es in dem S3-Pfad bucketname \ Employeeid \ file_randomnumber.png
Wie kann ich so etwas tun sein?
Im Folgenden sind mein Code:
https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/api.py
@api_view(['POST'])
def update_employee_image(request):
# ----- YAML below for Swagger -----
"""
description: update employee image.
parameters:
- name: employee_id
type: integer
required: true
location: form
- name: face_image
type: file
required: true
location: form
"""
parser_classes = (FileUploadParser,)
employee_id = request.POST['employee_id']
face_image_obj = request.data['face_image']
employee = Employee.objects.get(id = employee_id)
logging.debug(f"API employee username {employee.username}")
#employee.face_image = face_image_obj
employee.upload = face_image_obj <--- here is where it assign the file to S3
employee.save()
return Response("Employee Updated!", status=status.HTTP_200_OK)
https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/models.py
class Employee(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee')
company = models.ForeignKey(Company)
username = models.CharField(max_length=30, blank=False)
upload = models.FileField(blank=True) <--- S3 field
https://gitlab.com/firdausmah/railercom/blob/master/railercom/settings.py (AWS Einstellungen)
AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET_NAME')
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
DEFAULT_FILE_STORAGE = 'railercomapp.storage_backends.MediaStorage'
https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/storage_backends.py von storages.backends.s3boto3 Import S3Boto3Storage
class MediaStorage(S3Boto3Storage):
location = 'media/yy'
file_overwrite = False
Ich habe meine django aws S3 Lösung auf https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html basiert.
Dank, ich bin nicht sicher, wie diese zu verwenden. Ich verstehe, dass der get_available_name aus dem Parameter des Modells stammt. Aber wie würde ich diese Informationen von der API weitergeben? Zum Beispiel möchte ich beim Datei-Upload die API, um das Mitarbeiter-ID-Verzeichnis zu definieren und einen zufälligen Namen für die Datei zu erstellen. – Axil