Попытка загрузить большие файлы BLOB-объектов - PullRequest
0 голосов
/ 08 октября 2019

Мне нужно загрузить большие файлы резервных копий из моей учетной записи хранения. Я пытаюсь сделать это с помощью SAS, и я сгенерировал ссылку, когда я использую эту ссылку и ввожу ее непосредственно в браузер, он загружает файл, но когда я пытаюсь загрузить через мой код, он дает мне пустой файл или не загружает файл вообще,Закомментированные строки - это те, которые я уже пробовал, последняя - Redirect (blobSasuri);

public async Task DownloadBlobItemAsync([FromQuery] string userId, [FromRoute] string fileName, [FromBody] PathObject path, [FromRoute] int filestorageConnectionId)
{
    var fileStorageConnection = await _customerProvider.GetFileStorageConnection(filestorageConnectionId);
    var customer = await _customerProvider.GetCustomer(fileStorageConnection.CustomerId);

    CloudBlockBlob blob = _fileStorage.DownloadBlobFile(fileStorageConnection.Id, userId, customer.Id, fileName, path.Path);

    var sas = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
    {
        SharedAccessStartTime = DateTime.UtcNow.AddHours(-5),
        SharedAccessExpiryTime = DateTime.UtcNow.AddHours(5),
        Permissions = SharedAccessBlobPermissions.Read
    });

    string blobSasUri = (string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas));

    // CloudBlockBlob blobNew = new CloudBlockBlob(new Uri(blobSasUri));

    // var pathNew = Directory.GetCurrentDirectory();
    // blobNew.DownloadToFileAsync(pathNew, FileMode.Create);

    //await blob.DownloadToFileAsync(blobSasUri, FileMode.Create);

    Redirect(blobSasUri);

    //using (var client = new WebClient())
    //{
    //    client.DownloadFile(blobSasUri, fileName);
    //}
}

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Это не работает для меня и для больших файлов> 5 ГБ. Что я сделал, так это вернул путь к файлу + добавил SAS и вернул его в веб-интерфейс. Так что теперь на веб-интерфейсе у меня есть ссылка на sas, и он загружает ее прямо через браузер.

0 голосов
/ 10 октября 2019

Я не знаю, какой метод вы использовали для загрузки блоба, я тестирую с blobSas.DownloadToStream(), у меня это сработало. Поэтому, возможно, вы могли бы попробовать с моим кодом.

 static void Main(string[] args)
    {
        string storageConnectionString = "connectin string";

        // Check whether the connection string can be parsed.
        CloudStorageAccount storageAccount;

        CloudStorageAccount.TryParse(storageConnectionString, out storageAccount);

        var containerName = "test";
        var blobName = "testfile.zip";
        string saveFileName = @"E:\testfilefolder\myfile1.zip";

        var blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference(containerName);
        var blob = blobContainer.GetBlockBlobReference(blobName);
        var sas =blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
        {
            SharedAccessStartTime = DateTime.UtcNow.AddHours(-5),
            SharedAccessExpiryTime = DateTime.UtcNow.AddHours(5),
            Permissions = SharedAccessBlobPermissions.Read
        });
        string blobSasUri = (string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas));

        //Download Blob through SAS url
        CloudBlockBlob blobSas = new CloudBlockBlob(new Uri(blobSasUri));

        long startPosition = 0;
        using (MemoryStream ms = new MemoryStream())
        {
            blobSas.DownloadToStream(ms);
            byte[] data = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(data, 0, data.Length);

            using (FileStream fs = new FileStream(saveFileName, FileMode.OpenOrCreate))
            {
                fs.Position = startPosition;
                fs.Write(data, 0, data.Length);
            }
        }
    }

И кроме как с помощью sas url для загрузки большого двоичного объекта, другой вариант - это обслуживание файла кусками. Вот код.

        int segmentSize = 1 * 1024 * 1024;//1 MB chunk

        var blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference(containerName);
        var blob = blobContainer.GetBlockBlobReference(blobName);
        blob.FetchAttributes();
        var blobLengthRemaining = blob.Properties.Length;
        long startPosition = 0;
        string saveFileName = @"E:\testfilefolder\myfile.zip";
        do
        {
            long blockSize = Math.Min(segmentSize, blobLengthRemaining);
            byte[] blobContents = new byte[blockSize];
            using (MemoryStream ms = new MemoryStream())
            {
                blob.DownloadRangeToStream(ms, startPosition, blockSize);
                ms.Position = 0;
                ms.Read(blobContents, 0, blobContents.Length);
                using (FileStream fs = new FileStream(saveFileName, FileMode.OpenOrCreate))
                {
                    fs.Position = startPosition;
                    fs.Write(blobContents, 0, blobContents.Length);
                }
            }
            startPosition += blockSize;
            blobLengthRemaining -= blockSize;
        }
        while (blobLengthRemaining > 0);

Надеюсь, это поможет вам, если у вас все еще есть другие проблемы, пожалуйста, дайте мне знать.

...