Я разрабатываю загрузчик файлов, который использует 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")));