Процесс загрузки файла .NET Core 2.0 MVC - PullRequest
0 голосов
/ 29 мая 2018

Итак, у меня была адская попытка отобразить индикатор выполнения для моего приложения .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;
    }

ЧтоЯ хотел бы знать, это:

  1. Насколько я понимаю, я должен был бы сделать 2 индикатора выполнения, 1 для клиентской машины к моему серверу, чем другой от моего сервера до лазури.Это правильно?

  2. Как отобразить ход выполнения каждого из моих файлов на веб-интерфейсе?Я предположил бы, что это будет ajax-запрос к List [i], который я настроил в своем контроллере?

  3. Чтение байтов в цикле while, когда файл уже буферизован?Если я могу получить доступ к потоку файлов, разве файл уже не буферизован на сервере?

  4. Как я могу использовать реализацию IProgress Azure, чтобы возвращать мне результат при его изменении?Console.Writeline, похоже, не работает.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вы близки, вам нужно предоставить экземпляр StorageProgress вашему обработчику перед вызовом UploadFromStreamAsync:

long byteLength = 1048576L; // 1MB at time
StorageProgress storageProgress = new StorageProgress(byteLength);
progressHandler.Report(storageProgress);
0 голосов
/ 08 июня 2018

С другой стороны, вы должны попробовать использовать механизм проверки хода загрузки BLOB-объекта, образец ниже:

 var speedSummary = blobService.createBlockBlobFromStream('mycontainer', file.name, fileStream, file.size, function(error, result, response) {...}

setTimeout(function() {
    if (!finishedOrError) {
        var process = speedSummary.getCompletePercent();
        displayProcess(process);
        refreshProgress();
    }
}, 200);

Более подробную информацию вы можете найти здесь: https://github.com/Azure/azure-storage-node/issues/310

1- Вы можете использовать только один индикатор выполнения

2- Вы можете использовать механизм прогресса, недавно опубликованный в github на основе загрузки BLOB-объектов.

...