Uploom

Tools & SDKs

boto3 (Python)

boto3 is the official AWS SDK for Python. Configure it to talk to the gateway with a custom endpoint URL and path-style addressing.

Install

pip install boto3

Client setup

import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="https://s3.uploom.io",
    aws_access_key_id="<access-key-id>",
    aws_secret_access_key="<secret-access-key>",
    region_name="us-east-1",
    config=boto3.session.Config(signature_version="s3v4", s3={"addressing_style": "path"}),
)

Buckets

# List
for b in s3.list_buckets()["Buckets"]:
    print(b["Name"], b["CreationDate"])

# Head
s3.head_bucket(Bucket="bucket")

Upload a file

# One-shot, single-part
s3.upload_file("./photo.jpg", "bucket", "photos/2026/photo.jpg",
               ExtraArgs={"ContentType": "image/jpeg"})

# Streaming
with open("./huge.iso", "rb") as f:
    s3.upload_fileobj(f, "bucket", "backups/huge.iso")

Download

s3.download_file("bucket", "photos/2026/photo.jpg", "./photo.jpg")

with open("./photo.jpg", "wb") as f:
    s3.download_fileobj("bucket", "photos/2026/photo.jpg", f)

List objects

paginator = s3.get_paginator("list_objects_v2")
for page in paginator.paginate(Bucket="bucket", Prefix="photos/"):
    for obj in page.get("Contents", []):
        print(obj["Key"], obj["Size"])

Multipart upload

import boto3
from boto3.s3.transfer import TransferConfig

s3 = boto3.client("s3", endpoint_url="https://s3.uploom.io", ...)
config = TransferConfig(multipart_threshold=8 * 1024 * 1024, multipart_chunksize=16 * 1024 * 1024)
s3.upload_file("./huge.iso", "bucket", "backups/huge.iso", Config=config)

boto3 switches to multipart automatically when the body is above the threshold.

Presigned URL

url = s3.generate_presigned_url(
    "put_object",
    Params={"Bucket": "bucket", "Key": "uploads/x.bin"},
    ExpiresIn=900,
)
print(url)

Credentials from env

export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_ENDPOINT_URL_S3=https://s3.uploom.io

Then boto3.client("s3") works without any code change.