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()

下载完成,搞定!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值