Headless.Blobs.Abstractions
0.4.15
dotnet add package Headless.Blobs.Abstractions --version 0.4.15
NuGet\Install-Package Headless.Blobs.Abstractions -Version 0.4.15
<PackageReference Include="Headless.Blobs.Abstractions" Version="0.4.15" />
<PackageVersion Include="Headless.Blobs.Abstractions" Version="0.4.15" />
<PackageReference Include="Headless.Blobs.Abstractions" />
paket add Headless.Blobs.Abstractions --version 0.4.15
#r "nuget: Headless.Blobs.Abstractions, 0.4.15"
#:package Headless.Blobs.Abstractions@0.4.15
#addin nuget:?package=Headless.Blobs.Abstractions&version=0.4.15
#tool nuget:?package=Headless.Blobs.Abstractions&version=0.4.15
Headless.Blobs.Abstractions
Defines the unified interface for blob/file storage operations across different providers (AWS S3, Azure Blob, FileSystem, Redis, SFTP).
Problem Solved
Provides a provider-agnostic API for file storage operations, enabling seamless switching between cloud providers or local storage without changing application code.
Key Features
IBlobStorage- Core interface for all storage operations:- Upload blobs with metadata
- Open read stream for downloading
- Bulk upload/delete operations
- Copy/Rename/Delete operations
- Exists check and blob info retrieval
- Paged listing with search patterns
IBlobNamingNormalizer- Provider-specific path normalization- Container/directory management
- Metadata support
Installation
dotnet add package Headless.Blobs.Abstractions
Usage
public sealed class FileService(IBlobStorage storage)
{
public async Task UploadAsync(Stream file, string fileName, CancellationToken ct)
{
await storage.UploadAsync(
container: ["uploads", "images"],
blobName: fileName,
stream: file,
metadata: new Dictionary<string, string?> { ["uploaded-by"] = "user-123" },
cancellationToken: ct
);
}
public async Task<string?> GetContentAsync(string fileName, CancellationToken ct)
{
// IMPORTANT: Dispose result promptly - holding it may exhaust connection pools
await using var result = await storage.OpenReadStreamAsync(["uploads", "images"], fileName, ct);
if (result is null) return null;
using var reader = new StreamReader(result.Stream);
return await reader.ReadToEndAsync(ct);
}
}
Configuration
No configuration required. This is an abstractions-only package.
Dependencies
Headless.ExtensionsHeadless.Serializer.Json
Side Effects
None. This is an abstractions package.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- CommunityToolkit.HighPerformance (>= 8.4.2)
- Headless.Extensions (>= 0.4.15)
- Headless.Serializer.Json (>= 0.4.15)
- Humanizer.Core (>= 3.0.10)
- IdGen (>= 3.0.7)
- JetBrains.Annotations (>= 2025.2.4)
- libphonenumber-csharp (>= 9.0.30)
- Microsoft.Bcl.TimeProvider (>= 10.0.8)
- morelinq (>= 4.4.0)
- Nito.AsyncEx (>= 5.1.2)
- Nito.Disposables (>= 2.5.0)
- Polly.Core (>= 8.6.6)
- System.Reactive (>= 6.1.0)
- TimeZoneConverter (>= 7.2.0)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on Headless.Blobs.Abstractions:
| Package | Downloads |
|---|---|
|
Headless.Api.DataProtection
Package Description |
|
|
Headless.Blobs.FileSystem
Package Description |
|
|
Headless.Blobs.Aws
Package Description |
|
|
Headless.Blobs.SshNet
Package Description |
|
|
Headless.Blobs.Azure
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.