Skip to content

文件上传

在OSCA-OSS中用户的基本操作单元是对象,亦可以理解为文件,S3 GO SDK提供了丰富的上传接口,可以通过以下的方式上传文件:

  • 流式上传
  • 本地文件上传

流式上传

通过PutObject方法上传对象。示例代码如下:

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

本地文件上传

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