【问题标题】:Django - AWS S3 - Moving FilesDjango - AWS S3 - 移动文件
【发布时间】:2021-03-12 04:26:52
【问题描述】:

我使用 AWS S3 作为我的默认文件存储系统。我有一个带有如下文件字段的模型:

class Segmentation(models.Model):
    file = models.FileField(...)

我在第二台服务器上运行图像处理作业,将处理后的图像转储到不同的 AWS S3 存储桶。 我想将处理后的图像保存在我的Segmentation 表中。

目前我正在使用 boto3 手动将文件下载到我的“本地”服务器(我的 django-app 所在的位置),然后将其上传到本地 S3 存储桶,如下所示:

from django.core.files import File
import boto3

def save_file(segmentation, foreign_s3_key):
 
    # set foreign bucket
    foreign_bucket = 'foreign-bucket'

    # create a temp file:
    temp_local_file = 'tmp/temp.file'

    # use boto3 to download foreign file locally:
    s3_client = boto3.client('s3')
    s3_client.download_file(foreign_bucket , foreign_s3_key, temp_local_file)
            
    # save file to segmentation:
    segmentation.file = File(open(temp_local_file, 'rb'))
    segmentation.save()
            
    # delete temp file:
    os.remove(temp_local_file)

这工作正常,但它是资源密集型的。我有一些工作需要处理数百张图片。

有没有办法将文件从外部存储桶复制到我的本地存储桶并将segmentation.file字段设置为复制的文件?

【问题讨论】:

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


【解决方案1】:

我假设您想将一些文件从一个源存储桶移动到某个目标存储桶,正如 OP 标头所建议的那样,并在两者之间进行一些处理。

import boto3 
my_west_session = boto3.Session(region_name = 'us-west-2')
my_east_session = boto3.Session(region_name = 'us-east-1')
backup_s3 = my_west_session.resource("s3")
video_s3 = my_east_session.resource("s3")
local_bucket = backup_s3.Bucket('localbucket') 
foreign_bucket = video_s3.Bucket('foreignbucket')

for obj in foreign_bucket.objects.all():
    # do some processing
    # on objects
    copy_source = {
        'Bucket': foreign_bucket,
        'Key': obj.key
        }
    local_bucket.copy(copy_source, obj.key)

Session configurations

S3 Resource Copy Or CopyObject 取决于您的要求。

【讨论】:

  • 谢谢 - 我在另一个解决方案中看到了复制功能 - 现在我正在尝试将我的 django segmentation 实例中的文件字段分配给复制的文件 - 有什么想法吗?
  • @Daniel 我没听明白,您是否尝试访问 s3 对象的属性并将它们分配给您的自定义类字段?
  • 是的 - 但它不是自定义类 - 它是 Django 模型 - 并且字段:file = models.FileField() 本身就是一个 Django 类。
  • @Daniel 实际上在您共享的代码中,您没有访问对象的属性,而是打开文件并使用它创建 django File 对象。根据this doc,您可以这样做。坦率地说,我实际上并不确定您的项目是如何运作的,而且我对 django 也不太擅长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2022-01-09
  • 1970-01-01
  • 2020-05-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多