主题切换
快速入门
请确认您已经熟悉OSCA-OSS的基本概念,如Bucket、Object、EndPoint、AccessKeyId和AccessKeySecret等。 本节您将看到如何快速的使用AWS Python SDK,完成常用的操作,上传文件、下载文件等。
常用包安装
bash
pip3 install boto3
基本操作
创建S3客户端
endpoint
为可访问的文件网关S3网关地址 aws_access_key_id
和aws_secret_access_key
为认证使用的密钥 REMOTEDIR
为后续需要上传到OSCA的路径前缀 REMOTEBUCKET
为上传至OSCA的存储桶 ``
python
import boto3
endpoint='https://fgws3-ocloud.ihep.ac.cn'
aws_access_key_id="AccessKeyId"
aws_secret_access_key="AccessKeySecret"
s3_client = boto3.client(
's3',
endpoint_url=endpoint,
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name= 'us-east-1',
use_ssl=True #当网关为http://开头的时候则为False
)
REMOTEDIR = ""
REMOTEBUCKET = "20015-zk3333"
上传文件
对象(Object)是OSCA-OSS中最基本的数据单元,您可以把它简单的理解为文件,以下代码可以实现简单的对象上传:
python
import boto3
endpoint='https://fgws3-ocloud.ihep.ac.cn'
aws_access_key_id="AccessKeyId"
aws_secret_access_key="AccessKeySecret"
s3_client = boto3.client(
's3',
endpoint_url=endpoint,
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name= 'us-east-1',
use_ssl=True #当网关为http://开头的时候则为False
)
REMOTEDIR = ""
REMOTEBUCKET = "20015-zk3333"
def upload(file, name):
object_name = REMOTEDIR + name
s3_client.upload_file(file, REMOTEBUCKET, object_name)
presigned_url = s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': REMOTEBUCKET, 'Key': object_name},
ExpiresIn=3600 # 设置URL的有效期,这里设置为1小时
)
print(f"下载链接: {presigned_url}")
return presigned_url
}
#使用示例
upload("/path/to/file","remote")
上传后会返回下载链接
下载文件
上传对象成功之后,您可以读取它的内容,以下代码可以实现文件的下载:
python
import boto3
endpoint='https://fgws3-ocloud.ihep.ac.cn'
aws_access_key_id="AccessKeyId"
aws_secret_access_key="AccessKeySecret"
s3_client = boto3.client(
's3',
endpoint_url=endpoint,
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name= 'us-east-1',
use_ssl=True #当网关为http://开头的时候则为False
)
REMOTEDIR = ""
REMOTEBUCKET = "20015-zk3333"
def download_file(object_name, file_name):
s3_client.download_file(REMOTEBUCKET, object_name, file_name)
print(f"文件已下载到: {file_name}")
# 调用
download_file(REMOTEDIR+"remote","/path/to/file")
列举文件
当上传文件成功之后,可以查看桶中包含的文件列表,以下代码展示如何列举桶内的文件:
python
import boto3
endpoint='https://fgws3-ocloud.ihep.ac.cn'
aws_access_key_id="AccessKeyId"
aws_secret_access_key="AccessKeySecret"
s3_client = boto3.client(
's3',
endpoint_url=endpoint,
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name= 'us-east-1',
use_ssl=True #当网关为http://开头的时候则为False
)
REMOTEDIR = ""
REMOTEBUCKET = "20015-zk3333"
def list_files():
response = s3_client.list_objects_v2(Bucket=REMOTEBUCKET)
if 'Contents' in response:
for obj in response['Contents']:
print(f"文件名: {obj['Key']}, 大小: {obj['Size']} 字节")
else:
print("桶中没有文件")
list_files()
删除文件
文件上传成功后,可以指定删除桶中的文件,以下代码实现桶中文件的删除:
python
import boto3
endpoint='https://fgws3-ocloud.ihep.ac.cn'
aws_access_key_id="AccessKeyId"
aws_secret_access_key="AccessKeySecret"
s3_client = boto3.client(
's3',
endpoint_url=endpoint,
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name= 'us-east-1',
use_ssl=True #当网关为http://开头的时候则为False
)
REMOTEDIR = ""
REMOTEBUCKET = "20015-zk3333"
def delete_file(object_name):
s3_client.delete_object(Bucket=REMOTEBUCKET, Key=object_name)
print(f"文件 {object_name} 已删除")
delete_file(REMOTEDIR+"remote")
下载链接并上传至OSCA
python
import boto3
import httpx
import io
endpoint='https://fgws3-ocloud.ihep.ac.cn'
aws_access_key_id="AccessKeyId"
aws_secret_access_key="AccessKeySecret"
s3_client = boto3.client(
's3',
endpoint_url=endpoint,
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name= 'us-east-1',
use_ssl=True #当网关为http://开头的时候则为False
)
REMOTEDIR = ""
REMOTEBUCKET = "20015-zk3333"
# 获取下载链接的数据
def get_data_from_url(url):
with httpx.Client() as client:
return client.get(url)
# 通过下载链接上传数据
def upload_from_url(url, name):
object_name = REMOTEDIR + name
response = get_data_from_url(url)
# 检查请求是否成功
if response.status_code == 200:
data_stream = io.BytesIO(response.content)
# 将响应内容直接上传到 S3
s3_client.put_object(
Bucket=REMOTEBUCKET,
Key=object_name,
Body=data_stream,
# ContentLength=len(response.content),
ContentType=response.headers['Content-Type']
)
# 获取预签名URL
presigned_url = s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': REMOTEBUCKET, 'Key': object_name},
ExpiresIn=3600 # 设置URL的有效期,这里设置为1小时
)
print(f"下载链接: {presigned_url}")
return presigned_url
else:
print(f"下载失败,状态码: {response.status_code}")
return None
# 调用
upload_from_url("https://example.com/file", "remote")