Итак, у меня была адская попытка отобразить индикатор выполнения для моего приложения .Net Core MVC, и официальная документация не очень помогла.
Документы здесь: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.0#uploading-large-files-with-streaming
Я также хочу загрузить файл в хранилище BLOB-объектов Azure, когда он попадет на мои контроллеры.Пользователь может загрузить столько файлов, сколько ему нужно.
Вот мой код для загрузки:
for (int i = 0; i < videoFile.Count; i++)
{
long totalBytes = videoFile[i].Length;
byte[] buffer = new byte[16 * 1024];
using (Stream input = videoFile[i].OpenReadStream())
{
long totalReadBytes = 0;
int readBytes;
while ((readBytes = input.Read(buffer, 0, buffer.Length)) > 0)
{
totalReadBytes += readBytes;
var progress = (int)((float)totalReadBytes / (float)totalBytes * 100.0);
}
}
String videoPath = videoFile[i].FileName;
await sc.UploadBlobAsync(groupContainer, videoPath, videoFile[i]);
}
А вот мой метод UploadBlobAsync:
public async Task<bool> UploadBlobAsync(string blobContainer, string blobName, IFormFile file) {
CloudBlobContainer container = await GetContainerAsync(blobContainer);
CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
CancellationToken cancellationToken = new CancellationToken();
IProgress<StorageProgress> progressHandler = new Progress<StorageProgress>(
progress => Console.WriteLine("Progress: {0} bytes transferred", progress.BytesTransferred)
);
using (var filestream = file.OpenReadStream()) {
await blob.UploadFromStreamAsync(filestream,
default(AccessCondition),
default(BlobRequestOptions),
default(OperationContext),
progressHandler,
cancellationToken);
}
return true;
}
ЧтоЯ хотел бы знать, это:
Насколько я понимаю, я должен был бы сделать 2 индикатора выполнения, 1 для клиентской машины к моему серверу, чем другой от моего сервера до лазури.Это правильно?
Как отобразить ход выполнения каждого из моих файлов на веб-интерфейсе?Я предположил бы, что это будет ajax-запрос к List [i], который я настроил в своем контроллере?
Чтение байтов в цикле while, когда файл уже буферизован?Если я могу получить доступ к потоку файлов, разве файл уже не буферизован на сервере?
Как я могу использовать реализацию IProgress Azure, чтобы возвращать мне результат при его изменении?Console.Writeline, похоже, не работает.