Skip to content

快速入门

请确认您已经熟悉OSCA-OSS的基本概念,如Bucket、Object、EndPoint、AccessKeyId和AccessKeySecret等。 本节您将看到如何快速的使用AWS Python SDK,完成常用的操作,上传文件、下载文件等。

常用包安装

bash
pip3 install boto3

基本操作

创建S3客户端

endpoint为可访问的文件网关S3网关地址 aws_access_key_idaws_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")