Azure PutBlockAsync и PutBlockListAsync для загрузки чанка - PullRequest
0 голосов
/ 16 сентября 2018

Я разрабатываю загрузчик файлов, который использует Kendo UI для загрузки фрагмента файла по фрагменту. Серверной частью моего сайта является ядро ​​ASP.NET MVC, а Microsoft Azure используется для хранения загруженных файлов. Загрузчик чанков пользовательского интерфейса Kendo отправляет чанки на сервер, и я записываю эти чанки в BLOB-объект Azure, используя метод PutBlockAsync. После получения всех чанков я вызываю PutBlockListAsync, чтобы зафиксировать полученные чанки в лазуре, чтобы он создал загруженный файл в BLOB-объекте Azure. Отладчик не отображает никаких ошибок при вызове этих двух методов, но в BLOB-объекте Azure загруженный файл не создается.

Ниже приведены методы, которые я написал для вызова выше двух методов,

public async Task UploadInBlocksToAzure(string id, Stream stream)
    {
        try
        {
            var storageAccount = CloudStorageAccount.Parse(_connectionString);
            CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();

            var container = cloudBlobClient.GetContainerReference("test-video-in");
            var blob = container.GetBlockBlobReference("a.mp4");
            await blob.PutBlockAsync(id, stream, null);
        }
        catch (Exception e)
        {
            throw;
        }
    }

И этот метод заключается в фиксации файла

public async Task CommitBlocksToAzure(IEnumerable<string> ids)
    {
        try
        {
            var storageAccount = CloudStorageAccount.Parse(_connectionString);
            CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();

            var container = cloudBlobClient.GetContainerReference("test-video-in");
            var blob = container.GetBlockBlobReference("a.mp4");
            await blob.PutBlockListAsync(ids);
        }
        catch (Exception)
        {

            throw;
        }
    }

Параметр id в методе UploadInBlocksToAzure(string id, Stream stream) предоставляет строку в кодировке Base64, которая идентифицирует блок. Итак, в моем приложении, допустим, я загружаю файл размером 5,5 МБ, а размер блока составляет 1 МБ, тогда будет 5 блоков, и id каждого блока будет 0, 1, 2, 3 4 и 5. Когда я конвертирую эти числа в строки Base64, используя Convert.ToBase64String(BitConverter.GetBytes(chunkIndex)), я получаю идентификаторы чанка как AAAAAA==, AQAAAA==, AgAAAA==, AwAAAA==, BAAAAA== и BQAAAA==.

Что-то не так в подходе, которому я следую?

Обновление: Когда я изменяю логику для создания строки в кодировке Base64 для идентификатора блока, файл был успешно зафиксирован в голубом BLOB-объекте, но файл обрезан.

С

var id = Convert.ToBase64String(BitConverter.GetBytes(chunkData.ChunkIndex));

К

var id = Convert.ToBase64String(Encoding.UTF8.GetBytes(chunkData.ChunkIndex.ToString("d6")));

1 Ответ

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

Нет ничего плохого в том, как я выполняю эту задачу, но я проверил загруженное видео, загрузив его и воспроизведя в проигрывателе Windows Media. WMP показывает ошибку, говорящую о том, что файл может быть поврежден (исходный файл воспроизводится в WMP).

Но когда я копирую URL-адрес большого двоичного объекта загруженного файла из Azure и просматриваю его в веб-браузере, видео воспроизводилось без проблем.

Единственная проблема в коде - это способ создания идентификаторов блоков. Приведенный ниже подход работал для меня,

var id = Convert.ToBase64String(Encoding.UTF8.GetBytes(chunkData.ChunkIndex.ToString("d6")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...