首页 > 解决方案 > Django - AWS S3 - 移动文件

问题描述

我使用 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字段设置为复制的文件?

标签: pythondjangoamazon-web-servicesamazon-s3boto3

解决方案


我假设您想将一些文件从一个源存储桶移动到某个目标存储桶,正如 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)

会话配置

S3 资源复制或 CopyObject取决于您的要求。


推荐阅读