2017-11-19 1 views
0

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.

Antwort

0

Sie können die Speichermethode get_available_name überschreiben.

Hier ist ein Beispiel. Ändern Sie, um das genaue Dateinamensschema zu erhalten, das Sie wollen.

class MediaStorage(S3Boto3Storage): 
    location = 'media/yy' 
    file_overwrite = False 

    def get_available_name(self, name, max_length=None): 
     custom_name = f'/employeeid/{name}_randomnumber.png' 
     return super().get_available_name(custom_name, max_length) 

Docs: Writing a custom storage system

+0

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