【问题标题】:django aws S3 define upload file path and file dynamicallydjango aws S3动态定义上传文件路径和文件
【发布时间】:2018-05-02 19:18:34
【问题描述】:

在我的 Django 应用程序中, 我想在保存到 AWS S3 时动态定义上传路径和文件。到目前为止,我可以直接将文件保存到 S3,但是我想自己设置路径和文件名。

例如,上传时我希望它位于 S3 路径中 存储桶名称\employeeid\file_randomnumber.png

我该怎么做这样的事情?

下面是我的代码:

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 设置)

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 从 storages.backends.s3boto3 导入 S3Boto3Storage

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

我的 django aws S3 解决方案基于 https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html

【问题讨论】:

    标签: python django amazon-web-services amazon-s3 path


    【解决方案1】:

    您可以覆盖存储get_available_name 方法。

    这是一个例子。修改以获得您想要的确切文件名方案。

    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)
    

    文档:Writing a custom storage system

    【讨论】:

    • 谢谢,我不知道如何使用它。我知道 get_available_name 来自模型的参数。但是我将如何从 API 传递这些信息?例如,在文件上传时,我希望 api 定义员工 id 目录并为文件创建一个随机名称。
    猜你喜欢
    • 2010-12-31
    • 2016-06-08
    • 2021-10-24
    • 2017-08-24
    • 2021-02-02
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多