Как получить прогресс загрузки?
Извините за мой английский. У меня есть метод, в котором я отправляю StorageFile на сервер. Я пытался с помощью Windows.Web.Http.HttpClient
, но не работает (получение неверного ответа от сервера), поэтому я использую System.Net.Http.HttpClient
,
Вот мой код:
public static async void Upload(string uri, StorageFile data, Action<double> progressCallback = null)
{
try
{
byte[] fileBytes =await ReadFile(data);
System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
MultipartContent content = new System.Net.Http.MultipartFormDataContent();
var file1 = new ByteArrayContent(fileBytes);
file1.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "file1",
FileName = data.Name,
};
content.Add(file1);
System.Net.Http.HttpResponseMessage response = await client.PostAsync(uri, content);
response.EnsureSuccessStatusCode();
var raw_response = await response.Content.ReadAsByteArrayAsync();
var r2 = Encoding.UTF8.GetString(raw_response, 0, raw_response.Length);
if (r2[0] == '\uFEFF')
{
r2 = r2.Substring(1);
}
Logger.Info(r2);
}
catch (Exception exc)
{
Logger.Error( exc);
}
}
Можно ли изменить код для получения прогресса о загрузке файла в функцию обратного вызова?
2 ответа
В Windows Runtime вы можете попробовать переключиться на Windows.Web.HttpClient
учебный класс. это PostAsync
метод возвращает IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress>
интерфейс. Этот интерфейс имеет Progress
событие, на которое вы можете просто подписаться, прежде чем ждать результата.
Самый простой способ загрузить файл с прогрессом
У меня была такая же проблема, и после нескольких попыток выяснилось, что вы можете легко получить результат с точностью до байта, отслеживая
Position
FileStream файла, который вы собираетесь загрузить.
Это пример кода, который это демонстрирует.
FileStream fileToUpload = File.OpenRead(@"C:\test.mp3");
HttpContent content = new StreamContent(fileToUpload);
HttpRequestMessage msg = new HttpRequestMessage{
Content=content,
RequestUri = new Uri(--yourUploadURL--)
}
bool keepTracking = true; //to start and stop the tracking thread
new Task(new Action(() => { progressTracker(fileToUpload, ref keepTracking); })).Start();
var result = httpClient.SendAsync(msg).Result;
keepTracking = false; //stops the tracking thread
И определить
progressTracker()
в виде
void progressTracker(FileStream streamToTrack, ref bool keepTracking)
{
int prevPos = -1;
while (keepTracking)
{
int pos = (int)Math.Round(100 * (streamToTrack.Position / (double)streamToTrack.Length));
if (pos != prevPos)
{
Console.WriteLine(pos + "%");
}
prevPos = pos;
Thread.Sleep(100); //only update progress every 100ms
}
}
И это решило мою проблему.