C# Azure AppendBlob AppendBlock добавление файла размером более 4 МБ - PullRequest
1 голос
/ 19 февраля 2020

Я искал и искал и не нашел ни одного примера.

Я использую пакеты Azure .Storage.Blobs в C#. NET Core.

Вот пример моего текущего кода, который не работает.

Я получаю статус: 413 (Тело запроса слишком большое и превышает максимально допустимый предел.)

Поиск кажется, указывает на то, что существует ограничение 4 МБ или ограничение 100 МБ, это не ясно, но я думаю, что это 4 МБ для добавления блогов и ограничение 100 МБ для блочных объектов.

var appendBlobClient = containerClient.GetAppendBlobClient(string.Format("{0}/{1}", tenantName, Path.GetFileName(filePath)));

using FileStream uploadFileStream = File.OpenRead(filePath);
appendBlobClient.CreateIfNotExists();
appendBlobClient.AppendBlock(uploadFileStream);
uploadFileStream.Close();

Это не работает из-за ограничения 4 МБ поэтому мне нужно добавить 4 МБ фрагментов моего файла, но я не нашел примеров лучшего способа сделать это.

Так что я пытаюсь выяснить, это лучший способ загрузки больших файлов, кажется это должно быть сделано кусками, возможно, 4 МБ для добавочных BLOB-объектов и 100 МБ для блочных BLOB-объектов, но документация не ясна и не содержит примеров.

1 Ответ

2 голосов
/ 19 февраля 2020

Я хочу поблагодарить @silent за ответ, так как он предоставил достаточно информации, чтобы понять, что мне нужно. Иногда просто иметь кого-то, чтобы поговорить о вещах, помогает мне разобраться.

То, что я нашел в методе BlockBlobClient.Upload, это разбивает ваш файловый поток на вас. Я считаю, что это 100 МБ блоков из моих исследований. Похоже, что он имеет ограничение в 100 МБ блоков и 50000 из них

Для AppendBlockClient.AppendBlock он не разделяет ваш поток для вас. Он имеет ограничение в 4 МБ блоков и 50000 из них.

Вот часть моего кода, который позволил мне загрузить файл 6 ГБ в виде блочного блоба и файл 200 МБ в качестве добавочного блоба.

BlobServiceClient blobServiceClient = new BlobServiceClient(azureStorageAccountConnectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(azureStorageAccountContainerName);
containerClient.CreateIfNotExists();

if (appendData)
{
    var appendBlobClient = containerClient.GetAppendBlobClient(string.Format("{0}/{1}", tenantName, Path.GetFileName(filePath)));

    appendBlobClient.CreateIfNotExists();

    var appendBlobMaxAppendBlockBytes = appendBlobClient.AppendBlobMaxAppendBlockBytes;
    using (var file = File.OpenRead(filePath))
    {
        int bytesRead;
        var buffer = new byte[appendBlobMaxAppendBlockBytes];
        while ((bytesRead = file.Read(buffer, 0, buffer.Length)) > 0)
        {
            //Stream stream = new MemoryStream(buffer);
            var newArray = new Span<byte>(buffer, 0, bytesRead).ToArray();
            Stream stream = new MemoryStream(newArray);
            stream.Position = 0;
            appendBlobClient.AppendBlock(stream);
        }
    }
}
else
{
    var blockBlobClient = containerClient.GetBlockBlobClient(string.Format("{0}/{1}", tenantName, Path.GetFileName(filePath)));

    using FileStream uploadFileStream = File.OpenRead(filePath);
    blockBlobClient.DeleteIfExists();
    blockBlobClient.Upload(uploadFileStream);
    uploadFileStream.Close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...