Skip to content

Commit 933c12e

Browse files
committed
added UploadFileAsync overload to allow use of streams that don't support .Length
1 parent 77dde0d commit 933c12e

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

Bynder/Sdk/Service/Asset/AssetService.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,17 @@ public async Task<SaveMediaResponse> UploadFileAsync(Stream fileStream, UploadQu
156156
return await _uploader.UploadFileAsync(fileStream, query).ConfigureAwait(false);
157157
}
158158

159+
/// <summary>
160+
/// Check <see cref="IAssetService"/> for more information
161+
/// </summary>
162+
/// <param name="fileStream">Check <see cref="IAssetService"/> for more information</param>
163+
/// <param name="fileStreamLength">Length of the file stream</param>
164+
/// <param name="query">Check <see cref="IAssetService"/> for more information</param>
165+
/// <returns>Check <see cref="IAssetService"/> for more information</returns>
166+
public async Task<SaveMediaResponse> UploadFileAsync(Stream fileStream, long fileStreamLength, UploadQuery query)
167+
{
168+
return await _uploader.UploadFileAsync(fileStream, fileStreamLength, query).ConfigureAwait(false);
169+
}
159170

160171
/// <summary>
161172
/// Check <see cref="IAssetService"/> for more information

Bynder/Sdk/Service/Asset/IAssetService.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,14 @@ public interface IAssetService
9494

9595
Task<SaveMediaResponse> UploadFileAsync(Stream fileStream, UploadQuery query);
9696

97+
/// <summary>
98+
/// Uploads a file as a stream
99+
/// </summary>
100+
/// <param name="fileStream">Stream representing the file to be uploaded</param>
101+
/// <param name="fileStreamLength">Length of the file stream, to be used if the stream doesn't define it</param>
102+
/// <param name="query"></param>
103+
/// <returns></returns>
104+
Task<SaveMediaResponse> UploadFileAsync(Stream fileStream, long fileStreamLength, UploadQuery query);
97105

98106
/// <summary>
99107
/// Modifies a media

Bynder/Sdk/Service/Upload/FileUploader.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,19 @@ public static FileUploader Create(IApiRequestSender requestSender)
8080
/// <returns>Task representing the upload</returns>
8181
public async Task<SaveMediaResponse> UploadFileAsync(Stream fileStream, UploadQuery query)
8282
{
83-
return await UploadFileAsync(fileStream, query, query.OriginalFileName ?? Path.GetFileName(query.Filepath));
83+
return await UploadFileAsync(fileStream, fileStream.Length, query);
84+
}
85+
86+
/// <summary>
87+
/// Uploads a file with the data specified in query parameter
88+
/// </summary>
89+
/// <param name="fileStream">Stream of the file to upload</param>
90+
/// <param name="fileStreamLength">Length of the file stream</param>
91+
/// <param name="query">Upload query information to upload a file</param>
92+
/// <returns>Task representing the upload</returns>
93+
public async Task<SaveMediaResponse> UploadFileAsync(Stream fileStream, long fileStreamLength, UploadQuery query)
94+
{
95+
return await UploadFileAsync(fileStream, fileStreamLength, query, query.OriginalFileName ?? Path.GetFileName(query.Filepath));
8496
}
8597

8698
/// <summary>
@@ -96,31 +108,28 @@ public async Task<SaveMediaResponse> UploadFileAsync(UploadQuery query)
96108
uint chunkNumber = 0;
97109

98110
var fileStream = File.Open(query.Filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
99-
return await UploadFileAsync(fileStream, query, filename);
100-
101-
111+
return await UploadFileAsync(fileStream, fileStream.Length, query, filename);
102112
}
103113

104114
private async Task<UploadRequest> GetUploadRequest(string fileName)
105115
{
106116
return await RequestUploadInformationAsync(new RequestUploadQuery { Filename = fileName }).ConfigureAwait(false);
107117
}
108118

109-
110-
private async Task<SaveMediaResponse> UploadFileAsync(Stream fileStream, UploadQuery query, string filename)
119+
private async Task<SaveMediaResponse> UploadFileAsync(Stream fileStream, long fileStreamLength, UploadQuery query, string filename)
111120
{
112121
uint chunkNumber = 0;
113122
var uploadRequest = await GetUploadRequest(filename);
114123

115124
await using (fileStream)
116125
{
117126
byte[] buffer = new byte[CHUNK_SIZE];
118-
long numberOfChunks = (fileStream.Length + buffer.Length - 1) / buffer.Length;
127+
long numberOfChunks = (fileStreamLength + buffer.Length - 1) / buffer.Length;
119128
long totalBytesRead = 0;
120129

121-
while (totalBytesRead < fileStream.Length)
130+
while (totalBytesRead < fileStreamLength)
122131
{
123-
int bytesToRead = (int)Math.Min(buffer.Length, fileStream.Length - totalBytesRead);
132+
int bytesToRead = (int)Math.Min(buffer.Length, fileStreamLength - totalBytesRead);
124133

125134
await UploadChunkAsync(uploadRequest, filename, fileStream, buffer, bytesToRead, numberOfChunks, ++chunkNumber);
126135

0 commit comments

Comments
 (0)