Skip to content

Commit ab008a8

Browse files
committed
文件下载进度逻辑优化
1 parent 0713cca commit ab008a8

File tree

2 files changed

+22
-18
lines changed

2 files changed

+22
-18
lines changed

WebApiClient/HttpResponseFile.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -90,26 +90,31 @@ public async Task SaveAsAsync(Stream stream)
9090
throw new ArgumentException(nameof(stream) + " cannot be write", nameof(stream));
9191
}
9292

93-
var length = 0;
9493
var current = 0L;
9594
var buffer = new byte[8 * 1024];
9695
var sourceStream = await this.HttpResponse.Content.ReadAsStreamAsync().ConfigureAwait(false);
9796

98-
var args = new ProgressEventArgs(current, this.FileSize, false);
99-
this.DownloadProgressChanged?.Invoke(this, args);
100-
101-
while ((length = await sourceStream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false)) > 0)
97+
while (true)
10298
{
99+
var length = await sourceStream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
100+
var isCompleted = length == 0;
101+
103102
current = current + length;
103+
var total = this.FileSize;
104+
if (isCompleted == true && total == null)
105+
{
106+
total = current;
107+
}
104108

105-
args = new ProgressEventArgs(current, this.FileSize, false);
109+
var args = new ProgressEventArgs(current, total, isCompleted);
106110
this.DownloadProgressChanged?.Invoke(this, args);
107111

112+
if (isCompleted == true)
113+
{
114+
break;
115+
}
108116
await stream.WriteAsync(buffer, 0, length).ConfigureAwait(false);
109117
}
110-
111-
args = new ProgressEventArgs(current, this.FileSize, true);
112-
this.DownloadProgressChanged?.Invoke(this, args);
113118
}
114119
}
115120
}

WebApiClient/Parameterables/MulitpartFile.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,19 +116,18 @@ async Task IApiParameterable.BeforeRequestAsync(ApiActionContext context, ApiPar
116116
private UploadStream GetUploadStream()
117117
{
118118
var inner = this.stream ?? new FileStream(this.filePath, FileMode.Open, FileAccess.Read);
119-
return new UploadStream(inner, this.RaiseUploadProgressChanged);
119+
return new UploadStream(inner, this.OnUploadProgressChanged);
120120
}
121121

122122
/// <summary>
123123
/// 触发上传进度变化事件
124124
/// </summary>
125125
/// <param name="e"></param>
126-
private void RaiseUploadProgressChanged(ProgressEventArgs e)
126+
protected virtual void OnUploadProgressChanged(ProgressEventArgs e)
127127
{
128128
this.UploadProgressChanged?.Invoke(this, e);
129129
}
130130

131-
132131
/// <summary>
133132
/// 表示上传数据流
134133
/// </summary>
@@ -147,7 +146,7 @@ private class UploadStream : Stream
147146
/// <summary>
148147
/// 进度事件处理者
149148
/// </summary>
150-
private readonly Action<ProgressEventArgs> eventArgsHandler;
149+
private readonly Action<ProgressEventArgs> progressChangedHandler;
151150

152151
/// <summary>
153152
/// 记录当前字节数
@@ -158,12 +157,12 @@ private class UploadStream : Stream
158157
/// 上传数据流
159158
/// </summary>
160159
/// <param name="inner">内部流</param>
161-
/// <param name="eventArgsHandler">进度事件处理者</param>
160+
/// <param name="progressChangedHandler">进度事件处理者</param>
162161
/// <exception cref="ArgumentNullException"></exception>
163-
public UploadStream(Stream inner, Action<ProgressEventArgs> eventArgsHandler)
162+
public UploadStream(Stream inner, Action<ProgressEventArgs> progressChangedHandler)
164163
{
165164
this.inner = inner ?? throw new ArgumentNullException(nameof(inner));
166-
this.eventArgsHandler = eventArgsHandler ?? throw new ArgumentNullException(nameof(eventArgsHandler));
165+
this.progressChangedHandler = progressChangedHandler ?? throw new ArgumentNullException(nameof(progressChangedHandler));
167166

168167
try
169168
{
@@ -193,7 +192,7 @@ public UploadStream(Stream inner, Action<ProgressEventArgs> eventArgsHandler)
193192
public override long Length => this.inner.Length;
194193

195194
/// <summary>
196-
/// 获取数据指针公交车
195+
/// 获取数据指针位置
197196
/// </summary>
198197
public override long Position
199198
{
@@ -223,7 +222,7 @@ public override int Read(byte[] buffer, int offset, int count)
223222

224223
this.currentBytes = this.currentBytes + length;
225224
var args = new ProgressEventArgs(this.currentBytes, this.totalBytes, isCompleted);
226-
this.eventArgsHandler.Invoke(args);
225+
this.progressChangedHandler.Invoke(args);
227226

228227
return length;
229228
}

0 commit comments

Comments
 (0)