FluentStorage

repository·develop·Indexed 19 days ago

https://github.com/robinrodricks/fluentstorage

A polycloud .NET library providing a unified, asynchronous API for interacting with cloud storage providers (AWS, Azure, GCP, etc.) and protocols (FTP, SFTP). It abstracts object storage and queue messaging, allowing developers to switch backends without changing business logic. Supports features such as presigned URLs, versioning, tagging, and storage tiers across various providers including MinIO, MongoDB GridFS, and Alibaba OSS.

Tokens
8K
Snippets
2
Records
11
Agent score
16%

What's inside FluentStorage

  1. Overview of FluentStorage

    develop

    FluentStorage is a fully managed polycloud .NET cloud storage library designed for speed and provider abstraction. It provides a single unified API to interface with multiple cloud providers, allowing you to switch between them or support multiple providers simultaneously without changing your application logic.

    Key characteristics:

    • Polycloud API: Unified interface for Object storage and Queue messaging.
    • Zero Configuration: Each provider is distributed via its own NuGet package and requires no configuration files.
    • Asynchronous: Fully asynchronous API with consistent behavior across all providers.
    • Unified Path System: A consistent way to reference paths across different storage backends.
    • Extensive Features: Supports object manipulation (create, get, set, move, delete), high-level directory uploads/downloads with rule-based filtering, streaming (including video playback support), and metadata management.
  2. Understand the FluentStorage architecture

    develop
    FluentStorage provides a single, consistent API to interact with multiple cloud providers. Instead of writing code against vendor-specific APIs (like Amazon S3 or Azure Blob), you use the FluentStorage abstraction. Each specific cloud provider is supported through its own dedicated NuGet package, allowing you to switch providers or implement polycloud strategies with minimal changes to your core application logic.
  3. Specialized Features for Object Storage and SFTP/FTP

    develop

    Depending on the provider, FluentStorage offers specialized capabilities beyond basic CRUD operations.

    Object Storage Specifics

    • Presigned URLs: Generation of URLs with AWS-friendly and Azure-friendly API signatures.
    • Virtual Directories: Manipulation of virtual directory structures.
    • Versioning: Fetching older versions, deleting specific versions, etc.
    • Tagging: Adding and removing object tags.
    • Storage Tiers: Modifying object storage tiers or storage classes.

    SFTP and FTP Specifics

    • Directory Management: Listing and manipulating directories.
    • Fast Checksums: Server-side file checksums using native FTP and SSH commands.
    • SSH Command Engine: For SFTP, executes native SSH commands with automatic OS and utility detection.
    • Permissions: Modification of file permissions (CHMOD).
    • Metadata: Retrieval of detailed server metadata and OS information.
  4. Understand how FluentStorage maps cloud concepts

    develop

    FluentStorage provides a unified abstraction layer that maps common storage concepts to provider-specific implementations. This allows you to write code that works across different clouds while understanding how the underlying features are implemented.

    ConceptAWS S3Azure BlobGCP
    Versioning APIObject VersionsBlob VersionsObject Generations
    Tagging APIObject TagsBlob Index Tags / Blob TagsCustom Metadata
    Metadata APIObject MetadataBlob MetadataObject Metadata
    Storage TierStorage ClassAccess TierStorage Class
    Retention API (planned)Object Lock RetentionImmutability PolicyRetention Policy
    Locking API (planned)Object Lock Configuration / Legal HoldLegal Hold + Immutability PolicyObject Holds
  5. Install FluentStorage NuGet packages

    develop

    FluentStorage is distributed via NuGet. You must install the core FluentStorage package along with the specific provider package for the storage service you intend to use.

    Core and Provider Packages

    • FluentStorage: Standard storage interface.
    • FluentStorage.AWS: AWS S3 and SQS support.
    • FluentStorage.GCP: Google Cloud Storage support.
    • FluentStorage.Azure: General Azure support.
    • FluentStorage.Azure.Blobs: Azure Blob Storage.
    • FluentStorage.Azure.Files: Azure Files.
    • FluentStorage.Azure.ServiceBus: Azure Service Bus.
    • FluentStorage.Azure.KeyVault: Azure Key Vault.
    • FluentStorage.Azure.Queues: Azure Queue Storage.
    • FluentStorage.Minio: Minio OSS support.
    • FluentStorage.Mongo: MongoDB GridFS support.
    • FluentStorage.Alibaba: Alibaba OSS support.
    • FluentStorage.FTP: FTP support.
    • FluentStorage.SFTP: SFTP support.
  6. Check platform and .NET compatibility

    develop

    FluentStorage is compatible with .NET and .NET Standard/.NET Core. It provides binaries for the following target frameworks:

    • .NET 7.0 (net70)
    • .NET 8.0 (net80)
    • .NET 9.0 (net90)
    • .NET Standard 2.0 (netstandard2.0)
    • .NET Standard 2.1 (netstandard2.1)

    Additionally, via .NET Standard support, it works on:

    • Mono 4.6
    • Xamarin.iOS 10.0
    • Xamarin.Android 10.0
    • Universal Windows Platform 10.0
  7. Map StorageTier to cloud-specific tiers

    develop

    FluentStorage uses a unified StorageTier enum to abstract away the different storage classes provided by various cloud vendors. When you set a tier in FluentStorage, it maps to the corresponding tier in the underlying provider (AWS, Azure, or GCP) as follows:

    | Concept                   | AWS S3              | Azure Blob        |    GCP           |
    | ------------------------- | --------------------- | ------------------ | ------------------ |
    | `StorageTier.Standard`    | `STANDARD`            | `Hot`          | `STANDARD`         |
    | `StorageTier.Intelligent` | `INTELLIGENT_TIERING` | `AutoTiering`  | `AUTOCLASS`        |
    | `StorageTier.Nearline`    | `STANDARD_IA`         | `Cool`          | `NEARLINE`         |
    | `StorageTier.Cold`       | `GLACIER_IR`          | `Cold`          | `COLDLINE`         |
    | `StorageTier.Archive`    | `GLACIER`             | `Archive`      | `ARCHIVE`         |
    | `StorageTier.DeepArchive` | `DEEP_ARCHIVE`        | `Archive`      | `ARCHIVE`         |
  8. Supported IStore API capabilities by provider

    develop

    The IStore interface provides a unified API for interacting with various storage providers. However, not all providers support every method. Use this reference to understand the capabilities of your chosen provider across categories like system information, file listing, upload/download, directory manipulation, streaming, metadata, versioning, tagging, storage tiers, presigned URLs, and permissions.

    Key Capability Groups:

    • System Information: GetClient, GetServer.
    • File Listing: ListDirectory, ListObjects.
    • File Upload/Download: GetObject, SetObject, GetBytes, SetBytes, DownloadObject, UploadObject, OpenRead, OpenWrite.
    • Directory Operations: DownloadDirectory, UploadDirectory, IsFileSystem, DirectoryExists, CreateDirectory, DeleteDirectory, MoveDirectory.
    • File Manipulation: ObjectExists, MoveObject, DeleteObject, DeleteObjects.
    • Metadata & Versioning: GetObjectChecksum, GetObjectLength, GetObjectInfo, IsVersioned, ListObjectVersions, etc.
    • Advanced Features: Tagging (IsTagged, GetObjectTags), Storage Tiers (IsTiered, GetObjectTier), and Presigned URLs (GetUploadUrl, GetDownloadUrl).
    <table>
    <thead
    >
    
    <tr>
    <th>API</th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/azure.png" width="32"> <br><b>Azure<br>Blobs</b></th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/azure.png" width="32"> <br><b>Azure<br>Files</b></th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/aws.png" width="32"> <br><b>AWS S3</b></th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/gcp.png" width="32"> <br><b>GCP</b></th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/minio.png" width="32"> <br><b>MinIO</b></th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/mongo.png" width="32"> <br><b>Mongo</b></th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/alibaba.png" width="32"> <br><b>Alibaba</b></th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/ftp.png" width="32"> <br><b>FTP</b></th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/sftp.png" width="32"> <br><b>SFTP</b></th>
    <th> <img src="https://raw.githubusercontent.com/robinrodricks/FluentStorage/develop/.github/providers/local.png" width="32"> <br><b>Disk</b></th>
    </tr>
    
    </thead>
    <tbody
    >
    
    <tr>
    <td colspan="11"><b>System information</b></td>
    </tr>
    <tr>
    <td>&nbsp; GetClient</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; GetServer</td>
    <td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>✔️</td><td>❌</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    
    <tr>
    <td colspan="11"><b>File listing</b></td>
    </tr>
    <tr>
    <td>&nbsp; ListDirectory</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; ListObjects</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    
    <tr>
    <td colspan="11"><b>File upload &#x2F; download</b></td>
    </tr>
    <tr>
    <td>&nbsp; GetObject</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; SetObject</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; GetBytes</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; SetBytes</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; DownloadObject</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; UploadObject</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; OpenRead</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; OpenWrite</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    
    
    <tr>
    <th>API</th>
    <th><b>Azure<br>Blobs</b></th>
    <th><b>Azure<br>Files</b></th>
    <th><b>AWS S3</b></th>
    <th><b>GCP</b></th>
    <th><b>MinIO</b></th>
    <th><b>Mongo</b></th>
    <th><b>Alibaba</b></th>
    <th><b>FTP</b></th>
    <th><b>SFTP</b></th>
    <th><b>Disk</b></th>
    </tr>
    
    <tr>
    <td colspan="11"><b>Directory upload &#x2F; download</b></td>
    </tr>
    <tr>
    <td>&nbsp; DownloadDirectory</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; UploadDirectory</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    
    <tr>
    <td colspan="11"><b>Directory manipulation</b></td>
    </tr>
    <tr>
    <td>&nbsp; IsFileSystem</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; DirectoryExists</td>
    <td>✔️</td><td>❌</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; CreateDirectory</td>
    <td>✔️</td><td>❌</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; DeleteDirectory</td>
    <td>✔️</td><td>❌</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; MoveDirectory</td>
    <td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    
    
    <tr>
    <th>API</th>
    <th><b>Azure<br>Blobs</b></th>
    <th><b>Azure<br>Files</b></th>
    <th><b>AWS S3</b></th>
    <th><b>GCP</b></th>
    <th><b>MinIO</b></th>
    <th><b>Mongo</b></th>
    <th><b>Alibaba</b></th>
    <th><b>FTP</b></th>
    <th><b>SFTP</b></th>
    <th><b>Disk</b></th>
    </tr>
    
    <tr>
    <td colspan="11"><b>File streaming &#x2F; seeking</b></td>
    </tr>
    <tr>
    <td>&nbsp; IsSeekable</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; OpenRange</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; OpenSeekable</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    
    <tr>
    <td colspan="11"><b>File manipulation</b></td>
    </tr>
    <tr>
    <td>&nbsp; ObjectExists</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; MoveObject</td>
    <td>✔️</td><td>❌</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; DeleteObject</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; DeleteObjects</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    
    <tr>
    <td colspan="11"><b>File metadata</b></td>
    </tr>
    <tr>
    <td>&nbsp; GetObjectChecksum</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; GetObjectLength</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; GetObjectInfo</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; GetObjectsInfo</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; SetObjectInfo</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>❌</td><td>❌</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; SetObjectsInfo</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>❌</td><td>❌</td><td>✔️</td>
    </tr>
    
    
    <tr>
    <th>API</th>
    <th><b>Azure<br>Blobs</b></th>
    <th><b>Azure<br>Files</b></th>
    <th><b>AWS S3</b></th>
    <th><b>GCP</b></th>
    <th><b>MinIO</b></th>
    <th><b>Mongo</b></th>
    <th><b>Alibaba</b></th>
    <th><b>FTP</b></th>
    <th><b>SFTP</b></th>
    <th><b>Disk</b></th>
    </tr>
    
    <tr>
    <td colspan="11"><b>File versioning</b></td>
    </tr>
    <tr>
    <td>&nbsp; IsVersioned</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; ListObjectVersions</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    <tr>
    <td>&nbsp; GetObjectVersion</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    <tr>
    <td>&nbsp; RestoreObjectVersion</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    <tr>
    <td>&nbsp; DeleteObjectVersion</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    
    <tr>
    <td colspan="11"><b>File tagging</b></td>
    </tr>
    <tr>
    <td>&nbsp; IsTagged</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; GetObjectTags</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>✔️</td><td>🚫</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    <tr>
    <td>&nbsp; SetObjectTags</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>✔️</td><td>🚫</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    <tr>
    <td>&nbsp; DeleteObjectTags</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>✔️</td><td>🚫</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    
    <tr>
    <td colspan="11"><b>File storage tier</b></td>
    </tr>
    <tr>
    <td>&nbsp; IsTiered</td>
    <td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td>
    </tr>
    <tr>
    <td>&nbsp; GetObjectTier</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    <tr>
    <td>&nbsp; SetObjectTier</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    
    
    <tr>
    <th>API</th>
    <th><b>Azure<br>Blobs</b></th>
    <th><b>Azure<br>Files</b></th>
    <th><b>AWS S3</b></th>
    <th><b>GCP</b></th>
    <th><b>MinIO</b></th>
    <th><b>Mongo</b></th>
    <th><b>Alibaba</b></th>
    <th><b>FTP</b></th>
    <th><b>SFTP</b></th>
    <th><b>Disk</b></th>
    </tr>
    
    
    <tr>
    <td colspan="11"><b>Presigned URL generation</b></td>
    </tr>
    <tr>
    <td>&nbsp; GetUploadUrl</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>✔️</td><td>🚫</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    <tr>
    <td>&nbsp; GetDownloadUrl</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>✔️</td><td>🚫</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    <tr>
    <td>&nbsp; GetPresignedUrl</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>✔️</td><td>🚫</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    <tr>
    <td>&nbsp; GetObjectSas</td>
    <td>✔️</td><td>🚫</td><td>✔️</td><td>✔️</td><td>✔️</td><td>🚫</td><td>✔️</td><td>🚫</td><td>🚫</td><td>🚫</td>
    </tr>
    
    <tr>
    <td colspan="11"><b>File permissions</b></td>
    </tr>
    <tr>
    <td>&nbsp; GetFilePermissions</td>
    <td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>✔️</td><td>✔️</td><td>❌</td>
    </tr>
    <tr>
    <td>&nbsp; SetFilePermissions</td>
    <td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>✔️</td><td>✔️</td><td>❌</td>
    </tr>
    
    </tbody>
    </table>
  9. Use Queue and Messaging providers

    develop

    FluentStorage supports several queue and messaging providers. To use them, instantiate the corresponding factory class provided in the specific NuGet package.

    ProviderFactory Class
    AWS SQSAwsSqsStorage
    Azure QueueAzureQueueStorage
    Azure Service BusAzureServiceBus
  10. Supported Storage Providers and Factories

    develop

    FluentStorage supports a wide range of storage providers. To use a specific provider, you typically use its corresponding Factory class to instantiate a Store class. Some providers also allow you to access the underlying native client via GetClient().

    ProviderFactory ClassStore ClassGetClient() returns
    AWS S3AwsS3StorageS3StoreAmazonS3Client
    Azure BlobsAzureBlobStoreAzureBlobStoreBlobServiceClient
    Azure FilesAzureFilesStorageAzureFilesStoreShareServiceClient
    Azure DataLakeAzureDataLakeStorageAzureDataLakeStoreExtendedSdk
    GCPGoogleCloudStorageGoogleCloudStoreStorageClient
    MinIO (native)MinioStorageMinioStoreMinioClient
    MinIO (S3)MinioS3StorageS3StoreAmazonS3Client
    Cloudflare R2CloudflareR2StorageS3StoreAmazonS3Client
    DigitalOcean SpacesDigitalOceanSpacesStorageS3StoreAmazonS3Client
    WasabiWasabiStorageS3StoreAmazonS3Client
    Backblaze B2BackblazeB2StorageS3StoreAmazonS3Client
    HetznerHetznerStorageS3StoreAmazonS3Client
    VultrVultrStorageS3StoreAmazonS3Client
    MongoDB GridFSMongoGridStorageMongoGridStoreMongoClient
    Alibaba OSSAlibabaStorageAlibabaStoreOssClient
    FTPFtpStorageFtpStoreAsyncFtpClient
    SFTPSftpStorageSftpStoreSftpClient
    Local DiskStorageFactoryDiskStoreIFileSystem
  11. Identify provider-specific storage APIs

    develop

    FluentStorage provides specialized interfaces for specific cloud provider features that go beyond the standard storage API. Use these interfaces when you need access to provider-specific capabilities like leases, SAS tokens, or filesystem management.

    Azure Blobs (IAzureBlobStore)

    • AcquireLease
    • BreakLease
    • GetContainerPublicAccess
    • SetContainerPublicAccess
    • GetStorageSas
    • GetContainerSas

    Azure Data Lake (IAzureDataLakeStore)

    • ListFilesystems
    • CreateFilesystem
    • DeleteFilesystem
    • GetAccessControl
    • SetAccessControl

    AWS S3 (IS3Storage)

    • SetAcl