有人可以帮我吗,获取视频文件的内容长度仍然有问题。我正在尝试下载流视频文件。但我从响应中只能得到0byte。
这是我当前的代码。我不知道如何正确设置内容类型。你能帮我吗?
public async Task StartDownload(CancellationToken token)
{
Uri uri = new Uri(DownloadUrl, UriKind.Absolute);
SetConnection(uri);
using (var request = new HttpRequestMessage(HttpMethod.Get, uri)) {
request.RequestUri = uri;
request.Headers.Referrer = uri;
request.Headers.UserAgent.ParseAdd(UserAgent);
using (var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token)) {
token.ThrowIfCancellationRequested();
await DownloadFileFromHttpResponseMessage(response, token);
}
}
}
private async Task DownloadFileFromHttpResponseMessage(HttpResponseMessage response, CancellationToken token)
{
response.EnsureSuccessStatusCode();
using (var contentStream = await response.Content.ReadAsStreamAsync())
{
using (var content = new StreamContent(contentStream))
{
content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/octet-stream");
long? totalBytes = response.Content.Headers.ContentLength;
Console.WriteLine(totalBytes.GetValueOrDefault());
long totalBytesRead = 0;
long readCount = 0;
byte[] buffer = new byte[4096];
bool isMoreToRead = true;
using (var fileStream = new FileStream(OutputFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
{
do
{
token.ThrowIfCancellationRequested();
int bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length, token);
if (bytesRead == 0)
{
isMoreToRead = false;
TriggerProgressChanged(totalBytes, totalBytesRead);
continue;
}
await fileStream.WriteAsync(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
readCount += 1;
if (readCount % 10 == 0)
{
TriggerProgressChanged(totalBytes, totalBytesRead);
}
}
while (isMoreToRead);
}
TriggerProgressChanged(totalBytes, totalBytesRead);
}
}
}
private void TriggerProgressChanged(long? totalDownloadSize, long totalBytesRead)
{
if (ProgressChanged == null) { return; }
double? progressPercentage = null;
if (totalDownloadSize.HasValue) {
progressPercentage = Math.Round((double)((double)totalBytesRead / totalDownloadSize * 100), 2);
}
ProgressChanged(totalDownloadSize, totalBytesRead, progressPercentage);
}