Please read the Migration Guide to help you migrate from older versions to FluentStorage 8!
- FluentStorage
- New:
OverwriteByTimestampandOverwriteByChecksummodes to overwrite files based on timestamp or checksum - New:
UploadDirectorywill return a list of all the per-file progress reports at the end, and will record objects skipped due to rules - New:
DownloadDirectorywill return a list of all the per-file progress reports at the end, and will record objects skipped due to rules - New:
SkipReasoninside eachStorageProgressto indicate why the object was skipped - New:
SkipRuleinside eachStorageProgressto indicate which rule caused the object to be rejected - Change: Rename
StorageExistsModetoStorageExiststo reduce bloat - Fix:
UploadDirectoryandDownloadDirectorylogic that caused it not to overwrite files
- New:
- FluentStorage
- New:
GetObjectChecksumAPI to compute various types of hashes for an object across all providers - New:
StorageObjectHashobject to hold a hash value and easily compare it against any local file or stream - New:
StorageExistsMode.OverwriteIfChangedmode to only overwrite files if they have changed (length/checksum checks) - New:
UploadDirectorysupports theOverwriteIfChangedmode and only uploads files if the length/checksum mismatches - New:
DownloadDirectorysupports theOverwriteIfChangedmode and only downloads files if the length/checksum mismatches - Removed:
GetObjectMD5is removed in favour ofGetObjectChecksum
- New:
- FluentStorage.GCP
- New: Implement fast
GetObjectChecksumby usingGetObjectAsyncAPI to get MD5 object hash
- New: Implement fast
- FluentStorage.FTP
- New: Implement fast
GetObjectChecksumby using native FTP commands
- New: Implement fast
- FluentStorage.SFTP
- New: Implement fast
GetObjectChecksumby using native SSH shell commands to remotely compute an object hash. - New: Implement a powerful engine built for Windows and Unix to detects which Shell utilities are available once, then quickly use this information to compute a server-side hash of the file without needing to download it
- New: Security engine to prevent path-injection and command-injection (based on security engine from FluentFTP)
- New: Implement fast
- FluentStorage
- New: Optimize
StoragePath.Combinewhen combining only 2 path segments (most common use case)
- New: Optimize
- FluentStorage.SFTP
- New: Optimize
SetObject&SetBytesAPIs to improve transfer performance (4x faster) - New: Optimize
UploadObject&UploadDirectoryAPIs to improve transfer performance (2x faster) - New:
BufferSizeset to a default of 128KB to improve transfer performance - New:
TransferBufferSizesetting to change upload/download buffer size - Fix:
SetObjectnow correctly handles non-seekable streams - Fix:
CreateDirectorynow creates the entire directory path instead of just the last segment - Improve:
DirectoryExistsuses only one native API call to improve performance - Improve:
UploadObjectnow uses nativeUploadFileAsyncAPI to improve transfer performance - Remove:
SetLengthOnNewStreamas it is no longer supported
- New: Optimize
- FluentStorage
- New: Add rule-based filtering support in
DownloadDirectoryandUploadDirectoryfor all storage providers - New: Add rule engine and rules from FluentFTP:
ObjectNameRule,ObjectNameRegexRule,DirectoryNameRule,DirectoryNameRegexRule,ExtensionRule - New: Add new rule types for path checking:
FullPathRule,FullPathRegexRule - Fix: Fix all logic issues in rules based on unit test suite
- Fix: Support case-insensitive extension comparison in
ExtensionRule - Fix:
DownloadObjectensures parent directory exists and fix existance check - Fix:
DownloadDirectoryreports progress on successful transfers too - Fix:
UploadDirectoryreports progress on successful transfers too - Paths:
StoreObject: MakeFullPathinstant by computing it at time of construction rather than dynamically - Paths:
StoreObject: AddInputproperty to read the raw path given by the provider
- New: Add rule-based filtering support in
- FluentStorage.FTP
- Fix: Improve
DownloadObjectAPI to have consistant behaviour
- Fix: Improve
- FluentStorage.SFTP
- Fix: Improve
DownloadObjectAPI to have consistant behaviour
- Fix: Improve
- FluentStorage.Alibaba
- Fix: All API should use a single constructor for
StoreObject
- Fix: All API should use a single constructor for
- FluentStorage.Tests
- New: Extensive integration test suite for rule engine under
IStore.DirRulesclass - New: Extensive unit test suite for rule engine under
RuleTestsclass
- New: Extensive integration test suite for rule engine under
- FluentStorage
- Fix:
CreateDirectorywill not throw exceptions by default, allowing it to be called on cloud stores - Fix:
DeleteDirectoryhas a default implementation for all cloud stores, to delete all objects in a virtual folder - Change:
DiskStore:DeleteObjectwill no longer delete objects in a virtual directory - Change:
MemoryStore:DeleteObjectwill no longer delete objects in a virtual directory - Fix:
MemoryStore:ObjectExistsnormalizes the input path - New:
MemoryStore: Implement all missing API:OpenRange,OpenWrite,IsSeekable,GetObjectLength,CreateDirectory,DirectoryExists,DeleteDirectory,MoveDirectory,MoveObject
- Fix:
- FluentStorage.AWS
- New: Implement fast
DirectoryExistsvirtual directory check by using aListObjectsV2query withMaxKeysset - Fix: Fix access modifiers for
DigitalOceanSpacesStoragefactory API - Fix: All API now calls
StoragePath.Normalizeto support the unified path system - Change:
DeleteObjectwill no longer delete objects in a virtual directory
- New: Implement fast
- FluentStorage.Azure.Blobs
- New: Implement fast
DirectoryExistsvirtual directory check by using aGetBlobsAsyncquery
- New: Implement fast
- FluentStorage.Azure.Files
- Change:
DeleteObjectwill no longer delete objects in a virtual directory
- Change:
- FluentStorage.GCP
- New: Implement fast
DirectoryExistsvirtual directory check by using aExecuteAsyncquery withPageSizeset - Fix: All API now calls
StoragePath.Normalizeto support the unified path system - Fix:
OpenRangewill not throw when the object is missing (consistant with other API) - Change:
DeleteObjectwill no longer delete objects in a virtual directory
- New: Implement fast
- FluentStorage.FTP
- Fix: All API now calls
StoragePath.Normalizeto support the unified path system - Change:
DeleteObjectwill no longer delete objects in a virtual directory
- Fix: All API now calls
- FluentStorage.SFTP
- Fix:
DeleteDirectoryno longer normalizes paths multiple times
- Fix:
- FluentStorage.Alibaba
- New: Implement fast
DirectoryExistsvirtual directory check by using aListObjectsquery withMaxKeysset
- New: Implement fast
- FluentStorage.Minio
- New: Implement fast
DirectoryExistsvirtual directory check by using aListObjectsArgsquery - Fix:
OpenRead: Opening non-existant objects will no longer throw exceptions - Fix:
OpenRange: Opening non-existant objects will no longer throw exceptions - Fix:
OpenWritewill return null if the object already exists, instead of throwing exceptions - Fix: Consistantly catch object not found exceptions using
ObjectNotFoundException
- New: Implement fast
- FluentStorage.Mongo
- New: Implement fast
DirectoryExistsvirtual directory check by querying for a single file whose filename begins with the directory prefix - Fix:
OpenRead: Opening non-existant objects will no longer throw exceptions - Fix:
OpenRange: Opening non-existant objects will no longer throw exceptions - Fix:
OpenWritewill return null if the object already exists, instead of throwing exceptions - Fix: Credential connection uses
SCRAM-SHA-256by default
- New: Implement fast
- FluentStorage.Tests
- New: Add provider-specific config settings for Alibaba OSS, Backblaze B2, Cloudflare R2, DigitalOcean Spaces, Hetzner, Minio S3, Minio Native, Vultr, Wasabi, Mongo GridFS
- New: Add integration test suites for Alibaba OSS, Backblaze B2, Cloudflare R2, DigitalOcean Spaces, Hetzner, Minio S3, Minio Native, Vultr, Wasabi, Mongo GridFS
- New: Update
fluentstorage.yaml.templatewith new provider-specific settings
- FluentStorage
- Fix:
UploadDirectoryis more efficient for filesystem-based storage providers
- Fix:
- FluentStorage.Tests
- Add support for loading test config from YAML file
fluentstorage.yaml - Add
fluentstorage.yaml.templatebased on required test config schema - Add tests for FTP and SFTP using new config system
- Add provider-specific assertions to ensure that required test config settings are filled
- Remove unused
LogMagicandConfig.Netpackages, and addYamlDotNet - Split
IStoreTestinto multiple partial classes and improve test codebase organization - New tests for directory upload, directory download, roundtrip
- Fix: Disable tests that are malfunctioning with FTP/SFTP
- Add support for loading test config from YAML file
- FluentStorage.FTP
- Fix: Any file uploads/writes will automatically create the directory structure as required
- Fix:
CreateDirectory: No error is thrown if the folder already exists - Fix:
SetBytesnow correctly uploads zero-byte file data
- FluentStorage.SFTP
- Fix: All API now uses Async API of
SftpClientrather than the old sync API - Fix:
DownloadObjectandUploadObjecthad invalid file existance checks - Fix:
DownloadObjectnow correctly downloads file data (fix stream disposing issue) - Fix:
SetBytesandUploadObjectwill automatically create the directory structure as required - Fix:
SetBytesnow correctly uploads zero-byte file data - Fix:
CreateDirectory: No error is thrown if the folder already exists - Fix:
GetObjectInfoandGetObjectsInfocorrectly computes SFTP remote paths - Fix:
MaxResultsandBrowseFilterfiltering is more efficient during directory listing - Fix:
ListDirectoryandListObjectswill return a blank list if nothing is found instead of throwing an error - Fix:
ListDirectoryandListObjectswill correctly enumerate files inside subdirectories
- Fix: All API now uses Async API of
- FluentStorage.Azure.Queues
- Remove all usage of Newtonsoft.Json
- Cleanup JSON conversion and move all static utilities into
FluentStorage.Azure.Queues.UtilsNS
- FluentStorage
OpenSeekable: Return null if the stream cannot be created or the object length cannot be determined
- FluentStorage
- Transfer: Add new APIs to
DownloadDirectoryandUploadDirectory, with default implementation for all stores - Paths: Added
StoragePath.GetRelativeDiskPathandStoragePath.GetRelativeCloudPathto compute relative paths
- Transfer: Add new APIs to
- FluentStorage.FTP
- Transfer: Special handling using native FluentFTP APIs for
DownloadDirectoryandUploadDirectory
- Transfer: Special handling using native FluentFTP APIs for
- FluentStorage
- Paths: A new unified path system has been introduced across all providers!
- Paths:
StoragePath.Normalizehas been completely rewritten to enable the unified path system - Paths:
StoragePath.Combine,.Splitand.GetParentare completely rewritten for performance - Paths:
StoragePath.ComparePath,.RemoveRootFolder,.GetRootFolderand.Renamehave been removed - DiskStore:
GetObjectswill now return all objects in the main directory recursively by default - Move all sinks into
FluentStorage.SinksNS - Move
DelegatedStreamandNonCloseableStreamintoFluentStorage.Storage.SinksNS - Rename
SinkedBlobStoragetoSinkedStore - Remove
RandomGeneratorand move it into testing project
- FluentStorage.SFTP
- Paths: New SFTP path normalization system that works with updated
StoragePathnormalization
- Paths: New SFTP path normalization system that works with updated
- FluentStorage.GCP
- Paths: All APIs updated to use the new
StoragePathnormalization to support unified paths
- Paths: All APIs updated to use the new
- FluentStorage.Minio
- Paths: All APIs updated to use the new
StoragePathnormalization to support unified paths
- Paths: All APIs updated to use the new
- FluentStorage.Mongo
- Paths: All APIs updated to use the new
StoragePathnormalization to support unified paths
- Paths: All APIs updated to use the new
- FluentStorage.Alibaba
- Paths: All APIs updated to use the new
StoragePathnormalization to support unified paths
- Paths: All APIs updated to use the new
- FluentStorage.Tests
- Merge all tests into a single project, cleanly seperating unit and integration tests
- New tests for path normalization (
StoragePath.Normalize), path combination (StoragePath.Combine) and path splitting (StoragePath.Split) - New tests for
SeekableStreamused in seeking/streaming - New tests for
IStoreoperations and fixes made to local disk implementation
- FluentStorage
- IStore: Implement new object versioning APIs, tagging APIs and storage tier APIs
- IStore: Change
IsFileSystem,IsSeekableto async to align with other feature check APIs - IStore: Add
IsVersioned,IsTaggedandIsTieredto check if providers support new features - Assertions: Remove
AssertFullPathand handle it inline in all APIs
- FluentStorage.AWS
- Add versioning APIs:
IsVersioned,ListObjectVersions,GetObjectVersion,RestoreObjectVersion,DeleteObjectVersion - Add tagging APIs:
IsTagged,GetObjectTags,SetObjectTags,DeleteObjectTags - Add storage tier APIs:
IsTiered,GetObjectTier,SetObjectTier
- Add versioning APIs:
- FluentStorage.Azure.Blob
- Add versioning APIs:
IsVersioned,ListObjectVersions,GetObjectVersion,RestoreObjectVersion,DeleteObjectVersion - Add tagging APIs:
IsTagged,GetObjectTags,SetObjectTags,DeleteObjectTags - Add storage tier APIs:
IsTiered,GetObjectTier,SetObjectTier
- Add versioning APIs:
- FluentStorage.GCP
- Rewrite path normalization to be simpler and not overly aggressive
- Add versioning APIs:
IsVersioned,ListObjectVersions,GetObjectVersion,RestoreObjectVersion,DeleteObjectVersion - Add tagging APIs:
IsTagged,GetObjectTags,SetObjectTags,DeleteObjectTags - Add storage tier APIs:
IsTiered,GetObjectTier,SetObjectTier
- FluentStorage.Alibaba
- Add tagging APIs:
IsTagged,GetObjectTags,SetObjectTags,DeleteObjectTags
- Add tagging APIs:
- FluentStorage.Minio
- Add tagging APIs:
IsTagged,GetObjectTags,SetObjectTags,DeleteObjectTags - Add storage tier APIs:
IsTiered,GetObjectTier,SetObjectTier
- Add tagging APIs:
- FluentStorage
- Disk: Fix
ListObjectsand addGetServer&MoveObjectAPIs - Streams: Add
NonSeekableStreamto the core package - Rename core classes:
StoreObject,MemoryMessenger,DiskStore,MemoryStore - Move factory classes from
FluentStorage.AWS.Factory,FluentStorage.Alibaba.FactoryandFluentStorage.Minio.Factoryto root NS
- Disk: Fix
- FluentStorage.Mongo
- New: MongoDB GridFS storage provider using native MongoDB driver. Introduces the factory API
MongoGridStorageand store classMongoGridStore.
- New: MongoDB GridFS storage provider using native MongoDB driver. Introduces the factory API
- Add APIs to all providers:
GetObjectLengthand integrate it with streaming/seeking implementation
- Add streaming/seeking APIs to all providers:
OpenRange,OpenSeekable
- Fix some issues with the original v8 release.
- FluentStorage
- All cloud storage API methods have been redesigned to improve productivity and ease of use.
- All extension-method factory API has been removed: For example
StorageFactory.BlobsandStorageFactory.Messagesno longer exist. - Factory classes have been introduced on a per-provided basis.
- Factory classes can be accessed directly to construct new
IStoreobjects: For exampleAwsS3Storage.FromCredentialsrather thanStorageFactory.Blobs.AwsS3. - All API methods are
asyncand the "Async" suffix has been dropped. - All API methods have an optional
CancellationTokenrather than forcing users to provide one. - At initialization, S3-compatible stores will no longer create the bucket if the specified bucket does not exist.
WriteAsync()is renamed toSetObject()and will auto compute the object's MIME type (Content-Type) if it is not supplied.GetPresignedUrl()and its variations will auto compute the object's MIME type (Content-Type).CreateDirectory()will no longer create a "dummy file" in a cloud storage bucket.RenameAsync()is renamed toMoveObject()and will no longer perform a recursive copy and delete, instead it will efficiently move using native operations.ExistsAsync()is renamed toObjectExists()and will consistently return true/false if the file or folder exists on the bucket/server.DeleteAsync()is renamed toDeleteObject()and will consistently delete a single file or folder from the bucket/server.DeleteObjects()will consistently delete multiple files or folders from the bucket/server.GetClient()will consistently return the internal cloud SDK client for all types of cloud storage. (ReplacesNativeBlobClient)- Collections returned by APIs will always be
Listinstead ofIReadOnlyCollection. - Exceptions are moved into the
FluentStorage.Exceptionsnamespace - Enums are moved into the
FluentStorage.Enumsnamespace - Bucket stores now support streaming/seeking, presigned URL and more object manipulation API
- We no longer support Databricks, ServiceFabric, EventHub, Virtual storage and ZIP archives
- FluentStorage.AWS
- Breaking changes to entire API surface to improve productivity and ease of use.
- New API:
GetClient,MoveObject,DownloadObject,UploadObject,OpenRead,OpenWrite,GetUploadUrl,GetDownloadUrl,GetPresignedUrl,GetObjectSas,OpenRange,OpenSeekable,GetObjectLength.
- FluentStorage.GCP
- Breaking changes to entire API surface to improve productivity and ease of use.
- New API:
GetPresignedUrl,GetObjectSas,MoveObject,DeleteDirectory,OpenRange,OpenSeekable,GetObjectLength.
- FluentStorage.Azure.Blobs
- Breaking changes to entire API surface to improve productivity and ease of use.
- New API:
GetClient,MoveObject,DownloadObject,UploadObject,OpenRead,OpenWrite,GetUploadUrl,GetDownloadUrl,GetPresignedUrl,GetObjectSas,OpenRange,OpenSeekable,GetObjectLength.
- FluentStorage.Azure.Files
- Breaking changes to entire API surface to improve productivity and ease of use.
- New API:
GetClient,OpenRange,OpenSeekable,GetObjectLength.
- FluentStorage.Azure.ServiceBus
- Breaking changes to entire API surface to improve productivity and ease of use.
- FluentStorage.Azure.KeyVault
- Breaking changes to entire API surface to improve productivity and ease of use.
- FluentStorage.Azure.Queues
- Breaking changes to entire API surface to improve productivity and ease of use.
- FluentStorage.FTP
- Breaking changes to entire API surface to improve productivity and ease of use.
- FTP has new directory and server API for file systems
- New API:
GetServer,CreateDirectory,DeleteDirectory,DirectoryExists,MoveDirectory,GetFilePermissions,SetFilePermissions,MoveObject,DownloadObject,UploadObject,GetBytes,SetBytes,OpenRange,OpenSeekable,GetObjectLength.
- FluentStorage.SFTP
- Breaking changes to entire API surface to improve productivity and ease of use.
- SFTP has new directory and server API for file systems
- New API:
GetServer,CreateDirectory,DeleteDirectory,DirectoryExists,MoveDirectory,GetFilePermissions,SetFilePermissions,MoveObject,DownloadObject,UploadObject,GetBytes,SetBytes,OpenRange,OpenSeekable,GetObjectLength.
- FluentStorage.Alibaba
- New: Alibaba OSS provider using native Aliyun SDK. Introduces the factory API
AlibabaStorageand store classAlibabaStore.
- New: Alibaba OSS provider using native Aliyun SDK. Introduces the factory API
- FluentStorage.Minio
- New: MinIO storage provider using native Minio SDK. Introduces the factory API
MinioStorageand store classMinioStore.
- New: MinIO storage provider using native Minio SDK. Introduces the factory API
- FluentStorage.Databricks
- Deprecated and unlisted from Nuget since it is out of scope.
- FluentStorage.Azure.EventHub
- Deprecated and unlisted from Nuget since it has very low community usage.
- FluentStorage.Azure.DataLake
- Deprecated and unlisted from Nuget since DataLake Gen 1 is obsolete.
- FluentStorage.Azure.ServiceFabric
- Deprecated and unlisted from Nuget since it is out of scope and has very low community usage.
- FluentStorage
- Add connection string support for Wasabi, DigitalOcean Spaces, Cloudflare R2
- FluentStorage.AWS
- Add connection string support for Wasabi, DigitalOcean Spaces, Cloudflare R2
- FluentStorage
- New: All providers and sinks updated to support
WriteAsyncwith content type
- New: All providers and sinks updated to support
- FluentStorage.AWS
- New: Content type will automatically be computed for all uploaded files in S3 or S3-compatible storage (if not supplied by user)
- New: Add support for Cloudflare R2 with new factory API
StorageFactory.Blob.CloudflareR2 - New: Add support for uploading files to S3 or S3-compatible storage with MIME Type using
WriteAsyncAPI - New: Add dependency on
MimeMapping4.0.0 for content type computation - New: All providers updated to support
WriteAsyncwith content type - Fix: Allow null content types in
GetPresignedUrlAsyncAPI
- FluentStorage.Azure.Blobs
- Update
MimeMappingto version 4.0.0
- Update
- All providers updated to support
WriteAsyncwith content type- FluentStorage.Azure.Blobs
- FluentStorage.Azure.Files
- FluentStorage.Azure.DataLake
- FluentStorage.Azure.KeyVault
- FluentStorage.Azure.ServiceFabric
- FluentStorage.FTP
- Updated FluentFTP to 54.2.0
- FluentStorage.SFTP
- FluentStorage.Databricks
- FluentStorage
- Fix: Make hash helpers thread-safe using new
MD5.HashDataandSHA256.HashData.NET APIs
- Fix: Make hash helpers thread-safe using new
- FluentStorage.AWS
- Fix: Update AWS SDK packages to 4.0.100.2
- FluentStorage.Azure
- New: Add Azure identity authentication core framework
- New: Add dependency on
Azure.IdentitySDK package
- FluentStorage.Azure.Blobs
- New: Add dependency on
FluentStorage.Azurepackage - Change: Migrate from legacy API to
AzureStorageIdentitybased authentication
- New: Add dependency on
- FluentStorage.Azure.Files
- New: Add Azure Identity authentication supporting Shared Key, Azure AD, Service Principal, Managed Identity and Token Credential based authentication
- New: Add dependency on
Azure.Storage.Files.Sharespackage - New: Add dependency on
FluentStorage.Azurepackage - New: Add factory API for
AzureFiles,AzureFilesWithSharedKey,AzureFilesWithAzureAd,AzureFilesWithTokenCredential,AzureFilesWithMsi - Change: Migrate from legacy API to
AzureStorageIdentitybased authentication - Change: Rewrite all file management APIs to use new Azure SDK API (
CreateFromAccountNameAndKey,ListAt,Write,OpenRead,GetBlob,SetBlob,SetBlobs,DeleteSingle,DeleteDirectory,GetFileReference,GetDirectoryReference,GetShareReference) - Change: Remove dependency on outdated
Microsoft.Azure.Storage.FileSDK package
- FluentStorage
- Fix: Potential fix for unseekable streams at
StorageSourceStream.Seek
- Fix: Potential fix for unseekable streams at
- FluentStorage.Azure.Blobs
- New: Sets
Content-Typeheader on Azure blob uploads based on file extension to ensure proper browser rendering of files - New: Detects MIME type from blob path using
MimeUtilityfrom theMimeMappingNuget package - New: Automatically defaults to
application/octet-streamfor unknown extensions - New: Sets
Content-Typeof the blob viaBlobUploadOptionswithBlobHttpHeadersduring upload
- New: Sets
- FluentStorage.FTP
- Fix: Update FluentFTP to latest version 54.1.0
- FluentStorage.SFTP
- Fix: Update SSH.NET to latest version 2025.1.0
- New:
SetLengthOnNewStreamsetting to enable/disable callingSetLength()onSftpStreamwhen writing new blobs - Fix:
OpenReadAsyncfor fix issues when creating remote files where the user lacks permissions to set file attributes
- FluentStorage.AWS
- Use the
DeleteObjectsS3 API to optimize recursive deletes by using a single request
- Use the
- FluentStorage.Azure.Blobs
- New: Add
AzureBlobStoragefactory method acceptingBlobServiceClient
- New: Add
- FluentStorage.GCP
- Fix: Make
credparam optional ingoogle.storage://connection strings, falling back to Application Default Credentials
- Fix: Make
- FluentStorage.FTP
- Fixed logic in
Disposemethod that prevented the FTP client from being disposed - Update FluentFTP to 53.0.2
- Fixed logic in
- FluentStorage.AWS
- Added null check for
CommonPrefixesin theToBlobsmethod - Handle case where no S3 Objects exists in the response
- Added null check for
- FluentStorage.Azure.Blobs
- Added multi-region support for Azure Blob and DataLake
- FluentStorage.AWS
- Fix: Null Exception at
ListAsync
- Fix: Null Exception at
- FluentStorage
- Allow setting text content when writing dummy files
- Update
TestableIOpackages due to binary incompatibility - Respect
createIfNotExistsinGetFilePathand prevent unintended directory creation
- FluentStorage.Azure.Blobs
- Allow passing
BlobClientOptions - Update
OpenReadAsyncto useOpenReadAsyncfrom Azure SDK OpenReadAsyncfor efficient streaming overDownloadAsync- Minimise platform dependencies
- Update
Azure.IdentityNuget package to latest versions
- Allow passing
- FluentStorage.Azure.DataLake.Store
- Update
MicrosoftNuget package to latest versions
- Update
- FluentStorage.AWS
- Allow passing the Protocol property to the
PresignedRequest - Use
ContentTypewhen setting AWS Metadata - Handle response with null S3 objects
- Update AWS Nuget packages from v3.7 to v4.0
- Allow passing the Protocol property to the
- FluentStorage.Tests
- Upgrade projects from NET 6 to NET 9
- FluentStorage.FTP
- Upgrade FluentFTP to the latest version 53.0.1
- FluentStorage.SFTP
- Upgrade SSH.NET to the latest version 2025.0.0
- All projects
- Reduce .NET platform Nuget dependencies
- Drop support for
net50,net60 - Add support for
net70,net80,net90 - Cleanup folder structure and add a common
buildfolder for all projects
- Fix: Update to latest
Microsoft.IO.RecyclableMemoryStreampackage (thanks @dammitjanet) - New: Use
IFileSystempackage to improve testability ofDiskDirectoryBlobStorage(thanks @gerrewsb)
- New:
OpenWriteAsyncAPI to append to existing blobs (thanks @gentledepp) - Fix: Update to latest Azure packages (thanks @dammitjanet)
- Change: Swap from
MemoryStreamtoRecyclableMemoryStream(thanks @dammitjanet)
- New: Return additional headers in
GetObjectMetadataAsyncAPI for access toContent-Type(thanks @pkdigital)
- Fix: Paths prefixed with
\will be correctly handled inZipFileBlobStorage(thanks @gerrewsb) - New: Adds new connection string prefix
minio.s3to allow MinIO connections to be created using a connection string (thanks @NickHarmer) - Change: Default value of
ListOptions.RecursionModefromLocaltoRemote, so that S3/MinIO connections will recurse remotely by default - New: Add support for
ListOptions.PageSizewhich allows users to customize the number of objects returned per call - New: Added reflection utilities that can be used by other FluentStorage modules
- Fix:
ExtendedSdk.GetHttpPipelineneeds to be manually set otherwise connection to DataLake Gen2 fails
- New:
BucketNameAPI inAwsS3BlobStorageto obtain the bucket name (thanks @Pchol) - New:
SetAclAPI inAwsS3BlobStorageto set S3 object permissions (thanks @Pchol) - New: Adds support for connection string prefix
minio.s3(thanks @NickHarmer) - New: Add support for
ListOptions.PageSizewhich allows users to customize the number of objects returned per call - New: Add support for
ListOptions.NumberOfRecursionThreadsto configure the number of threads
- New: Add support for
ListOptions.PageSizewhich allows users to customize the number of objects returned per call
- New: Add support for
ListOptions.NumberOfRecursionThreadsto configure the number of threads
- Fix: Add missing dependency to
PollyNuget package
- Fix: Incorrect extension method
MinIOin AWS Storage Factory
- Support for DigitalOceanSpaces, MinIO, Wasabi
- New:
StorageFactory.Blobs.DigitalOceanSpacesAPI for connecting to DigitalOcean Spaces - New:
StorageFactory.Blobs.MinIOAPI for connecting to MinIO storage servers - New:
StorageFactory.Blobs.WasabiAPI for connecting to Wasabi storage - New: Adds support for
serviceUrlparameter in theAws.S3connection string - New: Check to ensure
regionandserviceUrlare not specified together
- Fix:
DeleteAsyncwill delete all files in bucket if target object is not found - GCP packages have been updated to their latest versions
The following packages have had their dependencies updated. No other changes were done.
- FluentStorage.Azure.Blobs 5.2.3
- FluentStorage.Azure.DataLake 5.2.2
- FluentStorage.Azure.EventHub 5.2.2
- FluentStorage.Azure.Files 5.2.2
- FluentStorage.Azure.KeyVault 5.2.2
- FluentStorage.Azure.Queues 5.2.2
- FluentStorage.Azure.ServiceBus 6.0.1
- FluentStorage.Azure.ServiceFabric 5.2.2
- FluentStorage.Databricks 5.2.2
- FluentStorage.FTP 5.3.1
- FluentStorage.SFTP 5.3.1
(thanks timbze)
- Fix: Disk blob storage
WriteAsyncusesCopyToAsyncrather than sync
(thanks beeradmoore)
- New:
ListAsyncnow supports recursion for listing directories usingFtpListOption.Recursive
(thanks beeradmoore)
- New:
ListAsyncnow supports recursion for listing directories using manual async recursion - Fix:
WriteAsyncnow sets the length of destination stream manually to avoid resulting data being left
(thanks GiampaoloGabba)
- Fix: Completely rewrite package for the new SDK
Azure.Messaging.ServiceBus - New: New API for construction
AzureServiceBusTopicReceiverandAzureServiceBusQueueReceiver - New:
IMessengerinterface uses structured string format for referencing queues/topics - New:
IAzureServiceBusMessengerinterface with API to send/create/delete/count a queue/topic/subscription
- Fix: Remove unused dependency package
Newtonsoft.Jsonfrom main project
(thanks dammitjanet)
- New: Constructor for
SymmetricEncryptionSinkandAesSymmetricEncryptionSinkto pass IV and key - New: Constructor for
EncryptedSinkabstract base class to pass in IV and key - New: Additional tests for encryption/decryption repeatability when the decrpytion IV is known
- Fix: Resolved Xunit errors and issue with with Xunit
FileDataattribute only finding a single file per test - Fix: Package updates and consolidation to latest Xunit
(thanks dammitjanet)
- New: Addition of
AesSymmetricEncryptionSinkandWithAesSymmetricEncryptionextension - Fix: Obsolesence of
SymmetricEncryptionSinkandWithSymmetricEncryptionextension - New: Updated Tests for
AesSymmetricEncryptionSink - New: Additional Blob/Stream file tests and XUnit
FileDataAttributeto support tests
- Fix:
AwsS3BlobStoragechecks if a bucket exists before trying to create one (thanks AntMaster7)
- Fix: Upgrade
System.Text.Jsonpackage from v4 to v7
- Fix: Upgrade
System.Text.Jsonpackage from v4 to v7 - Fix: Local storage: Handling of
LastModificationTimeandCreatedTime - Fix: Local storage:
LastAccessTimeUtcis saved as a Universal sortable string in the Blob properties
- Fix: Various fixes to
ListAsyncpath handling - Fix: Upgrade
SSH.NETpackage from v2016 to v2020
- New: Added support for a root path in the SFTP connection string
- Fix:
GetBlobsAsyncshould return an array with a single null if the file does not exist - Fix:
WriteAsyncwill create the directory if it does not exist
- New: Implement
LocalDiskMessenger.StartProcessorAsync - Package: Add Nuget reference to
Newtonsoft.Json 13.0.3 - Package: Remove Nuget reference to
Newtonsoft.Json 12.x.x - Package: Remove Nuget reference to
NetBoxand add the required utilities within this library
- New: Implement server-side filtering in
AwsS3DirectoryBrowser.ListAsyncby supplying aFilePrefix(thanks SRJames)
- Fix: Support for the append parameter in FluentFtpBlobStorage (thanks candoumbe)
- Fix:
IBlobStorage.WriteAsyncwill create the directory hierarchy if required (thanks candoumbe)
- Fix: Implementation of
LocalDiskMessenger.StartProcessorAsync(issue #14)(netstandard2.1/net6.0and above
- New: Introducing the FluentStorage set of libraries created from Storage.NET
- New: Added SFTP provider using SSH.NET
- Fix: FTP provider FluentFTP updated to v44
- Fix: AWS Nugets bumped to latest versions as of Jan 2023
- Fix: All nuget packages now target
netstandard2.0,netstandard2.1,net50,net60 - Change: Refactored package structure to simplify naming scheme
- Change: Refactored entire codebase to simplify code organization
- New: Documentation wiki created with one page per provider