/// <inheritdoc />
        public async Task <Skylink> UploadFile(UploadItem item, UploadOptions options = default)
        {
            if (item is null)
            {
                throw new ArgumentNullException(nameof(item));
            }
            options ??= UploadOptions._default;

            using var multiPartContent = new MultipartFormDataContent { CreateFileContent("file", item) };

            var response = await _httpClient.PostAsync($"/skynet/skyfile{options.ToQueryString()}", multiPartContent).ConfigureAwait(false);

            response.EnsureSuccessStatusCode();

            var contentStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

            var uploadResponse = await JsonSerializer.DeserializeAsync <UploadResponse>(contentStream, _jsonSerializerOptions).ConfigureAwait(false);

            return(uploadResponse.ParseAndValidate());
        }
 /// <inheritdoc />
 public Task <Skylink> UploadFile(IFileInfo file, UploadOptions options = default) => UploadFile(new UploadItem(file), options);
        /// <inheritdoc />
        public Task <Skylink> UploadFile(IFileProvider fileProvider, string filePath, UploadOptions options = default)
        {
            if (fileProvider is null)
            {
                throw new ArgumentNullException(nameof(fileProvider));
            }
            if (filePath is null)
            {
                throw new ArgumentNullException(nameof(filePath));
            }
            if (fileProvider is NullFileProvider)
            {
                throw new ArgumentException("Cannot access files from NullFileProvider", nameof(fileProvider));
            }
            if (string.IsNullOrWhiteSpace(filePath))
            {
                throw new ArgumentException("Path cannot be empty", nameof(filePath));
            }

            var fileInfo = fileProvider.GetFileInfo(filePath);

            if (!fileInfo.Exists)
            {
                throw new FileNotFoundException("Cannot find file at specified path", filePath);
            }

            return(UploadFile(new UploadItem(fileInfo), options));
        }