2015-11-05 2 views
1

Я использую следующую программу для загрузки больших файлов в хранилище azure blob. При загрузке небольшого файла менее 500 КБ, программа отлично работает иначе я получаю сообщение об ошибке в следующей строке:Загрузка больших файлов в azure blob

blob.PutBlock (blockIdBase64, поток, нуль);
как «Необработанное исключение типа„Microsoft.WindowsAzure.Storage.StorageException“произошло в Microsoft.WindowsAzure.Storage.dll Дополнительная информация: Удаленный сервер возвратил ошибку:. (400) Bad Request»

Информация об исключении отсутствует, поэтому я не уверен, в чем проблема. Есть ли какие-либо предложения относительно того, что может быть неправильно, что в следующей программе:

class Program 
    { 

    static void Main(string[] args) 
    { 
    string accountName = "newstg"; 
    string accountKey = "fFB86xx5jbCj1A3dC41HtuIZwvDwLnXg=="; 
    // list of all uploaded block ids. need for commiting them at the end 
    var blockIdList = new List<string>(); 
    StorageCredentials creds = new StorageCredentials(accountName, accountKey); 
    CloudStorageAccount storageAccount = new CloudStorageAccount(creds, useHttps: true); 
    CloudBlobClient client = storageAccount.CreateCloudBlobClient(); 
      
      
    CloudBlobContainer sampleContainer = client.GetContainerReference("newcontainer2"); 
    string fileName = @"C:\sample.pptx"; 
    CloudBlockBlob blob = sampleContainer.GetBlockBlobReference("APictureFile6"); 

    using (var file = new FileStream(fileName, FileMode.Open, FileAccess.Read)) 
    { 
    int blockSize = 1; 
    // block counter 
    var blockId = 0; 
    // open file 
    while (file.Position < file.Length) 
    { 
    // calculate buffer size (blockSize in KB) 
    var bufferSize = blockSize * 1024 < file.Length - file.Position ? blockSize * 1024 : file.Length - file.Position; 
    var buffer = new byte[bufferSize]; 
    // read data to buffer 
    file.Read(buffer, 0, buffer.Length); 
    // save data to memory stream and put to storage 
    using (var stream = new MemoryStream(buffer)) 
    { 
    // set stream position to start 
    stream.Position = 0; 
    // convert block id to Base64 Encoded string 
    var blockIdBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId.ToString(CultureInfo.InvariantCulture))); 
    blob.PutBlock(blockIdBase64, stream, null); 
    blockIdList.Add(blockIdBase64); 
    // increase block id 
    blockId++; 
    } 
    } 
    file.Close(); 
    } 
    blob.PutBlockList(blockIdList); 
    } 
    } 
+0

Почему вы все равно используете API PutBlock на низком уровне? В библиотеках Azure есть более простые способы загрузки данных. – usr

+0

@usr: Не могли бы вы предложить мне какую-либо библиотеку, которая использует поток и, возможно, блокирование вместо буфера, чтобы избежать проблем с памятью? – user1400915

+0

Google для «файла загрузки Azure .NET». Это решенная проблема. – usr

ответ

5

Вы получаете эту ошибку, потому что ваш блок идентификаторы не одинаковой длины. Таким образом, для 1-го 9 блоков ваша длина блока идентификатор 1 символ, но как только вы достигнете десятого заблокировать длину блока ID становится 2. Пожалуйста, сделать что-то вроде следующего:

var blockIdBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId.ToString("d6", CultureInfo.InvariantCulture))); 

Таким образом, все ваши идентификаторы блоков 6 символов длинный.

Для получения более подробной информации, пожалуйста, прочтите URI Parameters раздел здесь: https://msdn.microsoft.com/en-us/library/azure/dd135726.aspx.

Смежные вопросы