使用实际文件从 s3 模拟下载文件

Mock download file from s3 with actual file

我想编写一个测试来模拟从 s3 下载一个函数,并在本地用我机器上存在的实际文件替换它。我从这个 中得到灵感。思路如下:

from moto import mock_s3
import boto3

def dl(src_f, dest_f):
  s3 = boto3.resource('s3')
  s3.Bucket('fake_bucket').download_file(src_f, dest_f)

@mock_s3
def _create_and_mock_bucket():

    # Create fake bucket and mock it
    bucket = "fake_bucket"

    # We need to create the bucket since this is all in Moto's 'virtual' AWS account
    file_path = "some_real_file.txt"
    s3 = boto3.client("s3", region_name="us-east-1")
    s3.create_bucket(Bucket=bucket)
    s3.put_object(Bucket=bucket, Key=file_path, Body="")

    dl(file_path, 'some_other_real_file.txt')

_create_and_mock_bucket()

现在 some_other_real_file.txt 存在,但它不是 some_real_file.txt 的副本。知道怎么做吗?

如果您的系统上已经存在 'some_real_file.txt',您应该使用 upload_file: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_file

以你的例子为例:

file_path = "some_real_file.txt"
s3 = boto3.client("s3", region_name="us-east-1")
s3.create_bucket(Bucket=bucket)
s3_resource = boto3.resource('s3')
s3_resource.meta.client.upload_file(file_path, bucket, file_path)

您的代码目前在 S3 中创建了一个空文件(因为 Body=""),这正是下载到 'some_other_real_file.txt' 的内容。 请注意,如果您将 Body-parameter 更改为包含一些文本,那么确切的内容将下载到 'some_other_real_file.txt'.