CloudUploader Python SDK

A production-ready Python SDK for the CloudUploader file upload platform. Upload files to S3, Cloudflare R2, MinIO, Azure Blob, or GCS using presigned URLs — with parallel multipart uploads, automatic retries, and real-time progress tracking.
Quick Start
pip install clouduploader-py
from cloud_uploader import CloudUploader
uploader = CloudUploader(api_key="ck_live_xxx")
result = uploader.upload_file("video.mp4")
print(result.storage_path)
# → r2://my-bucket/ab/cd/1713080000000-a1b2c3-video.mp4
Installation (from source)
For development or building from source:
git clone https://github.com/CloudUploader/clouduploader-py.git
cd clouduploader-py
pip install -e .
# With dev dependencies (for running tests):
pip install -e ".[dev]"
Features
| Feature | Details |
|---|---|
| Simple API | Two lines to upload any file |
| Multipart uploads | Automatic chunking for large files |
| Parallel uploads | Configurable thread pool (default 5 threads) |
| Retry with backoff | Exponential backoff for transient failures |
| Progress tracking | Real-time callback with bytes uploaded/total |
| Multiple backends | r2, s3, minio, azure, gcs |
| Download | Download files by ID via presigned URLs |
| Type hints | Full type annotations, Python 3.9+ |
Configuration
uploader = CloudUploader(
api_key="ck_live_xxx", # Required
base_url="https://api.myapp.com", # Default: http://localhost:8080
timeout=30, # HTTP timeout (seconds)
max_retries=3, # Retry attempts for transient errors
max_parallel_uploads=5, # Thread pool size for multipart
chunk_size_override=None, # Override backend chunk size (bytes)
storage="r2", # Default storage backend
debug=False, # Enable debug logging
)
Upload with Progress
def progress(uploaded: int, total: int) -> None:
pct = uploaded / total * 100
print(f"\r{pct:.1f}%", end="", flush=True)
result = uploader.upload_file("large_video.mp4", progress_callback=progress)
Upload to Specific Backend
result = uploader.upload_file("data.csv", storage="s3")
Upload a Folder
# Recursively upload all files in a directory (skips hidden files by default)
result = uploader.upload_folder("./path/to/assets")
print(f"Succeeded: {result.succeeded}/{result.total_files}")
if result.failures:
print(f"Failed files: {len(result.failures)}")
# You can also use a glob pattern to filter specific files
result = uploader.upload_folder("./path/to/assets", file_filter="*.png")
Download a File
path = uploader.download_file(file_id="file_123", output_path="./downloads/file.jpg")
Error Handling
from cloud_uploader import (
CloudUploaderError,
AuthenticationError,
UploadInitError,
UploadFailedError,
)
try:
result = uploader.upload_file("file.pdf")
except AuthenticationError:
print("Invalid API key")
except UploadInitError as e:
print(f"Backend rejected upload: {e.error_code}")
except UploadFailedError as e:
print(f"Failed parts: {e.failed_parts}")
except CloudUploaderError as e:
print(f"Error: {e.message} (HTTP {e.status_code})")
Check Upload Status
status = uploader.get_upload_status("up_abc123")
print(status)
# {'success': True, 'upload_id': '...', 'status': 'completed', ...}
Abort an Upload
uploader.abort_upload("up_abc123")
Architecture
cloud_uploader/
├── __init__.py # Public API re-exports
├── client.py # CloudUploader — main user-facing class
├── uploader.py # UploadOrchestrator — direct vs multipart routing
├── multipart.py # Parallel multipart engine (ThreadPoolExecutor)
├── http_client.py # HTTP transport with retry + auth
├── utils.py # MIME types, file validation, formatting
└── exceptions.py # Exception hierarchy
Development & Testing
Run Tests
pip install -e ".[dev]"
pytest
Test with Your Backend
source .venv/bin/activate
CLOUD_UPLOADER_API_KEY=your_key python examples/basic_upload.py path/to/file --progress
Publishing a New Release
The PyPI publish workflow triggers on version tags (prefix v). To release a new version:
git tag v0.1.6
git push origin v0.1.6
The GitHub Action will automatically build and publish the package to PyPI using the PYPI_API_TOKEN secret.
Contributing
We welcome contributions! Please see our GitHub repository for:
- Issue tracking
- Pull request guidelines
- Development setup
Support
For issues, questions, or feedback:
- 📧 Email: support@clouduploader.io
- 🐛 Issues: GitHub Issues
- 📚 Docs: CloudUploader Documentation
License
MIT License - See LICENSE file for details
Metadata
Release files for clouduploader-py 0.1.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| clouduploader_py-0.1.7.tar.gz | 22.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| clouduploader_py-0.1.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.5 kB
Release files / clouduploader_py-0.1.7.tar.gz
| Download URL | clouduploader_py-0.1.7.tar.gz |
|---|---|
| Size | 22.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bf448630c41a448dfae6166d6b9712a1f5c7cda63e57a6aac726c92d58cc7c6d
|
|
BLAKE2b-256 checksum How to use checksums |
fe66ce48fdf69425bedc8ca554b95fb771e0733790d05f49d836930c1605d6fa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|
Release files / clouduploader_py-0.1.7-py3-none-any.whl
| Download URL | clouduploader_py-0.1.7-py3-none-any.whl |
|---|---|
| Size | 19.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e46c8e7e152c095c5f48985c7faa74a0fc59e24e5d291d47b5e9efd2624abff2
|
|
BLAKE2b-256 checksum How to use checksums |
72df037d7611a51ec73912cab3a3b239443d762510ef662b09b780954ac35cf8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|