Python boto3上传大文件报错解决,并从S3下载指定文件

根据业务需求,有一台存放日志文件的服务器即将清空日志,要将所有日志文件上传至S3,想使用时在另一台机器下载即可。
原本直接使用boto3传输,但传输过程报错了,原因是传输的文件太大了,超过传输限定阈值。
解决方法是导入TransferConfig,将传输配置为分段传输即可,实现很简单,上代码:

#导入需要的包
from boto3.session import Session
import boto3
from  boto3.s3.transfer  import  TransferConfig

REGION_NAME='你的AWS账户区域'
AWS_ACCESS_KEY_ID='你的AWS账号key'
AWS_SECRET_ACCESS_KEY='你的AWS密码'
BUCKET_NAME = '你的存储桶名字'

# 当文件大小超过multipart_threshold属性的值时,会发生多部分传输 。
# 如果文件大小大于TransferConfig对象中指定的阈值,以下示例将upload_file传输配置为分段传输。
# 1GB=1024的三次方=1073741824字节
GB  =  1024  **  3 
config  =  TransferConfig ( multipart_threshold = 5 * GB )

def upload(s3=init_s3_logo_photo(), bucket_name=BUCKET_NAME, file_name=None):
    #要上传的文件路径
    file_name = '/home/pubsrv/logs/log_for_20210621'
    #S3上要存放的文件路径
    key_name = 'log/log_for_20210621'
    try:
        # upload logo to s3,key_name指定S3上的路径,大于阀值分段传输
        s3.Bucket(bucket_name).upload_file(Filename=file_name, Key=key_name,ExtraArgs={
    
    'ACL':'public-read'},Config=config)
        print("{} upload done".format(file_name))
    except Exception as e:
        print("upload {} error:{}".format(file_name, e))

    
def init_s3_logo_photo(region_name=REGION_NAME, aws_access_key_id=AWS_ACCESS_KEY_ID,
                       aws_secret_access_key=AWS_SECRET_ACCESS_KEY):
    s3 = boto3.resource('s3', region_name=region_name, aws_access_key_id=aws_access_key_id,
                        aws_secret_access_key=aws_secret_access_key)
    return s3
upload()

上传成功!,打开S3控制台可以看到对应文件,在另一台机器上试着下载一下:

import boto3

REGION_NAME='你的AWS账户区域'
AWS_ACCESS_KEY_ID='你的AWS账号key'
AWS_SECRET_ACCESS_KEY='你的AWS密码'
BUCKET_NAME = '你的存储桶名字'
KEY = 'log/log_for_20210621'

def init_s3_logo_photo(region_name=REGION_NAME, aws_access_key_id=AWS_ACCESS_KEY_ID,
                       aws_secret_access_key=AWS_SECRET_ACCESS_KEY):
    s3 = boto3.resource('s3', region_name=region_name, aws_access_key_id=aws_access_key_id,
                        aws_secret_access_key=aws_secret_access_key)
    return s3

def download_from_s3(s3=init_s3_logo_photo(), bucket_name=BUCKET_NAME):
    print("begin---download")
    s3.Bucket(bucket_name).download_file(KEY,'log_for_20210621')
    print("download---over")

download_from_s3()

下载完成,搞定!

猜你喜欢

转载自blog.csdn.net/weixin_44123540/article/details/118492260
今日推荐