Fazendo upload de arquivos grandes para o Windows Azure Storage

Olá pessoal,

Nos meus últimos posts, escrevi sobre como fazer upload de um arquivo para um BLOB do Windows Azure Storage. Nesta ocasião, utilizei o método UploadFile para gravar o arquivo, que apesar de funcionar possui uma limitação de um tamanho máximo de 64 MB para cada arquivo.

No post de hoje vou falar um pouco sobre como fazer upload de arquivos maiores que 64 MB. Para fazer isso, devemos utilizar os métodos PutBlock e PutBlockList de um objeto do tipo CloudBlockBlob. O método PutBlock deve ser utilizado para subir trechos do arquivo, sendo que cada trecho pode ter o tamanho máximo de 4 MB. Já o método PutBlockList deve ser utilizado para efetivar a gravação dos blocos , como também a sua sequência.

A combinação desses métodos permite que o upload de um arquivo para um BLOB possa ser interrompido para posteriormente ser retomado, ou até mesmo que vários blocos possam ser enviados de maneira paralela ou sem ordenação, pois ela só é definida ao chamar o método PutBlockList.

Abaixo fiz um pequeno algoritmo para subir trechos de 1 MB de um arquivo para um BLOB.

 private static void PutBlocks(string filePath, CloudBlockBlob blob)
{
    int blockId = 0;
    const int blockSize = 1024 * 1024; // 1 MB
    byte[] blockContent = new byte[blockSize];
    FileStream file = new FileStream(filePath, FileMode.Open);
    int bytesRead = 0;
    List<string> blockList = new List<string>();

    while ((bytesRead = file.Read(blockContent, 0, blockSize)) > 0)
    {
        MemoryStream ms = new MemoryStream(blockContent, 0, bytesRead)
        {
            Position = 0 //Move o stream para o início
        };

        string blockId64 = Convert.ToBase64String(BitConverter.GetBytes(blockId));
        blob.PutBlock(blockId64, ms, null);
        blockList.Add(blockId64);

        ms.Close();
        blockId++;
    }

    blob.PutBlockList(blockList);

    file.Close();
}

[]’s

RG