导入 AWS SDK for Python
确保 Python v3.7 或更新版本已经安装。
初始化 venv 项目
python3 -m venv .venv . .venv/bin/activate 添加 AWS SDK for Python 包
python3 -m pip install boto3==1.28.85 对于之后的每个代码示例,将代码创建在 main.py 后,执行
python3 main.py 即可执行代码。
对象上传
获取客户端上传 URL
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) presigned_url = s3.generate_presigned_url(ClientMethod='put_object', Params={'Bucket': '<Bucket>', 'Key': '<Key>'}) print(presigned_url) 这段代码将生成一个经过预先签名的客户端上传 URL,有效期为 1 小时,客户端可以在过期时间内对该 URL 发送 HTTP PUT 请求将文件上传。
以下是用 curl 上传文件的案例:
curl -X PUT --upload-file "<path/to/file>" "<presigned url>" 您也可以自行指定上传凭证的有效期,例如:
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) presigned_url = s3.generate_presigned_url(ClientMethod='put_object', Params={'Bucket': '<Bucket>', 'Key': '<Key>'}, ExpiresIn=86400) print(presigned_url) 服务器端直传
单请求上传(文件)
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) with open('<path/to/upload>', 'rb') as f: s3.put_object(Bucket='<Bucket>', Key='<Key>', Body=f) 单请求上传(数据流)
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) s3.put_object(Bucket='<Bucket>', Key='<Key>', Body='Hello, Qiniu S3!') 分片上传(文件)
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) create_multipart_upload_response = s3.create_multipart_upload(Bucket='<Bucket>', Key='<Key>') uploaded = 0 PART_SIZE = 5*1024*1024 # 分片大小为 5 MB part_number = 1 parts = [] with open('<path/to/upload>', 'rb') as f: # 这里给出的案例是串行分片上传。可以自行改造成并行分片上传以进一步提升上传速度 while True: part_body = f.read(PART_SIZE) if len(part_body) == 0: break upload_part_response = s3.upload_part(Bucket=create_multipart_upload_response['Bucket'], Key=create_multipart_upload_response['Key'], UploadId=create_multipart_upload_response['UploadId'], PartNumber=part_number, Body=part_body) parts.append({'PartNumber': part_number, 'ETag': upload_part_response['ETag']}) part_number += 1 uploaded += len(part_body) complete_multipart_upload_response = s3.complete_multipart_upload( Bucket=create_multipart_upload_response['Bucket'], Key=create_multipart_upload_response['Key'], UploadId=create_multipart_upload_response['UploadId'], MultipartUpload={'Parts': parts}) print('ETag:', complete_multipart_upload_response['ETag']) 上传文件
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) s3.upload_file("<path/to/upload>", "<Bucket>", "<Key>") print('Done') 对象下载
获取客户端下载 URL
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) presigned_url = s3.generate_presigned_url(ClientMethod='get_object', Params={'Bucket': '<Bucket>', 'Key': '<Key>'}) print(presigned_url) 这段代码将生成一个经过预先签名的客户端下载 URL,有效期为 1 小时,客户端可以在过期时间内对该 URL 发送 HTTP GET 请求将文件下载。
以下是用 curl 下载文件的案例:
curl -o "<path/to/download>" "<presigned url>" 您也可以自行指定下载凭证的有效期,例如:
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) presigned_url = s3.generate_presigned_url(ClientMethod='get_object', Params={'Bucket': '<Bucket>', 'Key': '<Key>'}, ExpiresIn=86400) print(presigned_url) 服务器端直接下载
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) get_object_response = s3.get_object(Bucket='<Bucket>', Key='<Key>') with open('<path/to/download>', 'wb') as f: shutil.copyfileobj(get_object_response['Body'], f) print('ETag:', get_object_response['ETag']) 下载文件
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) s3.download_file('<Bucket>', '<Key>', '<path/to/download>') print('Done') 对象管理
获取对象信息
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) head_object_response = s3.head_object(Bucket='<Bucket>', Key='<Key>') print('ETag:', head_object_response['ETag']) 修改对象 MimeType
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) s3.copy_object(Bucket='<Bucket>', Key='<Key>', CopySource='/<Bucket>/<Key>', MetadataDirective='REPLACE', ContentType='<NewContentType>') print('Done') 修改对象存储类型
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) s3.copy_object(Bucket='<Bucket>', Key='<Key>', CopySource='/<Bucket>/<Key>', MetadataDirective='REPLACE', StorageClass='GLACIER') print('Done') 复制对象副本
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) s3.copy_object(Bucket='<ToBucket>', Key='<ToKey>', CopySource='/<FromBucket>/<FromKey>', MetadataDirective='COPY') print('Done') 复制对象副本(大于 5GB)
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) head_object_response = s3.head_object( Bucket='<FromBucket>', Key='<FromKey>') create_multipart_upload_response = s3.create_multipart_upload( Bucket='<ToBucket>', Key='<ToKey>') uploaded = 0 PART_SIZE = 5*1024*1024 # 分片大小为 5 MB part_number = 1 parts = [] copied = 0 # 这里给出的案例是串行分片上传。可以自行改造成并行分片上传以进一步提升上传速度 while copied < head_object_response['ContentLength']: part_size = min(head_object_response['ContentLength'] - copied, PART_SIZE) upload_part_copy_response = s3.upload_part_copy(Bucket=create_multipart_upload_response['Bucket'], Key=create_multipart_upload_response['Key'], UploadId=create_multipart_upload_response['UploadId'], PartNumber=part_number, CopySource='/<FromBucket>/<FromKey>', CopySourceRange=f'bytes={copied}-{copied+part_size}') parts.append({'PartNumber': part_number, 'ETag': upload_part_copy_response['CopyPartResult']['ETag']}) part_number += 1 copied += part_size complete_multipart_upload_response = s3.complete_multipart_upload( Bucket=create_multipart_upload_response['Bucket'], Key=create_multipart_upload_response['Key'], UploadId=create_multipart_upload_response['UploadId'], MultipartUpload={'Parts': parts}) print('ETag:', complete_multipart_upload_response['ETag']) 删除空间中的文件
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) s3.delete_object(Bucket='<Bucket>', Key='<Key>') print('Done') 获取指定前缀的文件列表
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) response = s3.list_objects_v2(Bucket='<Bucket>', Prefix='<KeyPrefix>') for object in response['Contents']: print('Key:', object['Key']) print('ETag:', object['ETag']) 批量删除空间中的文件
创建 main.py
import boto3 s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) s3.delete_objects(Bucket='<Bucket>', Delete={'Objects': [{'Key': '<Key1>'}, {'Key': '<Key2>'}, {'Key': '<Key3>'}]}) print('Done') 临时安全凭证
创建 main.py
import boto3 sts = boto3.client('sts', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id='<QiniuAccessKey>', aws_secret_access_key='<QiniuSecretKey>', config=boto3.session.Config(signature_version="s3v4")) get_federation_token_response = sts.get_federation_token(Name='Bob', DurationSeconds=3600, Policy='{"Version":"2012-10-17","Statement":[{"Sid":"Stmt1","Effect":"Allow","Action":["*"],"Resource":["*"]}]}') s3 = boto3.client('s3', region_name='cn-east-1', # 华东-浙江区 region id endpoint_url='https://s3.cn-east-1.qiniucs.com', # 华东-浙江区 endpoint aws_access_key_id=get_federation_token_response['Credentials']['AccessKeyId'], aws_secret_access_key=get_federation_token_response['Credentials']['SecretAccessKey'], aws_session_token=get_federation_token_response['Credentials']['SessionToken'], config=boto3.session.Config(signature_version="s3v4")) # 可以使用这些临时凭证调用 S3 服务 list_buckets_response = s3.list_buckets() for bucket in list_buckets_response['Buckets']: print(bucket['Name']) 文档反馈 (如有产品使用问题,请 提交工单)