как скопировать данные BLOB-объекта и сохранить их в подкаталоге с помощью функционального приложения

У меня есть большой двоичный объект в исходной виртуальной папке, и мне нужно переместить исходный большой двоичный объект в другую виртуальную папку и удалить исходный большой двоичный объект с помощью функционального приложения Azure.

  1. копирование данных BLOB-объектов из одного каталога в другой

  2. удаление исходного большого двоичного объекта

пожалуйста, проведите меня через код приложения-функции, как скопировать капли из одного каталога в другой и удалить капли

Я сталкиваюсь с некоторыми проблемами при копировании больших двоичных объектов в другой каталог.

 public async static void CopyDelete(ILogger log)
    {
        var ConnectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // details of our source file
        CloudBlobContainer sourceContainer = blobClient.GetContainerReference("Demo");            
        var sourceFilePath = "SourceFolder";
        var destFilePath = "SourceFolder/DestinationFolder";
 
        CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(sourceFilePath);
        CloudBlobDirectory dira = sourceContainer.GetDirectoryReference(sourceFilePath);
        CloudBlockBlob destinationblob = sourceContainer.GetBlockBlobReference(destFilePath);
        try
        {
            var rootDirFolders = dira.ListBlobsSegmentedAsync(true, BlobListingDetails.Metadata, null, null, null, null).Result;

            foreach (var blob in rootDirFolders.Results)
            {
                log.LogInformation("Blob   Detials " + blob.Uri);
               
                //var sas = sourceBlob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
                //{
                //    Permissions = SharedAccessBlobPermissions.Read,
                //    SharedAccessStartTime = DateTimeOffset.Now.AddMinutes(-5),
                //    SharedAccessExpiryTime = DateTimeOffset.Now.AddHours(2)
                //});

                // copy to the blob using the 
                destinationblob = sourceContainer.GetBlockBlobReference(destFilePath);
             //   var sourceUri = new Uri(blob.Uri);
                await destinationblob.StartCopyAsync(blob.Uri);

                // copy may not be finished at this point, check on the status of the copy
                while (destinationblob.CopyState.Status == Microsoft.WindowsAzure.Storage.Blob.CopyStatus.Pending)
                {
                    await Task.Delay(1000);
                    await destinationblob.FetchAttributesAsync();
                    await sourceBlob.DeleteIfExistsAsync();
                }
            }

            if (destinationblob.CopyState.Status != Microsoft.WindowsAzure.Storage.Blob.CopyStatus.Success)
            {
                throw new InvalidOperationException($"Copy failed: {destinationblob.CopyState.Status}");
            }
        }
        catch (Exception ex)
        {

            throw ex;
        }
        
    }

comment
Сначала необходимо загрузить большой двоичный объект, а затем загрузить его с новым именем. Для начала см. эти образцы   -  person Peter Bons    schedule 16.09.2020


Ответы (1)


Если вы хотите скопировать большой двоичный объект и удалить его, выполните следующие действия.

  1. список больших двоичных объектов с префиксом. Префикс используется для фильтрации результатов, чтобы возвращать только большие двоичные объекты, имена которых начинаются с указанного префикса.
 private static async  Task< List<BlobItem>> ListBlobsHierarchicalListing(BlobContainerClient container,
            string? prefix, int? segmentSize)
        {
            string continuationToken = null;
            var blobs = new List<BlobItem>();
            try
            {
                do
                {
                    var resultSegment = container.GetBlobsByHierarchyAsync(prefix: prefix, delimiter: "/")
                        .AsPages(continuationToken, segmentSize);

                    await foreach (Page<BlobHierarchyItem> blobPage in resultSegment)
                    {

                        foreach (BlobHierarchyItem blobhierarchyItem in blobPage.Values)
                        {
                            if (blobhierarchyItem.IsPrefix)
                            {

                                Console.WriteLine("Virtual directory prefix: {0}", blobhierarchyItem.Prefix);
                                var result = await ListBlobsHierarchicalListing(container, blobhierarchyItem.Prefix, null).ConfigureAwait(false);
                                blobs.AddRange(result);
                            }
                            else
                            {
                                Console.WriteLine("Blob name: {0}", blobhierarchyItem.Blob.Name);
                                
                                blobs.Add(blobhierarchyItem.Blob);
                            }
                        }

                        Console.WriteLine();

                        // Get the continuation token and loop until it is empty.
                        continuationToken = blobPage.ContinuationToken;
                    }


                } while (continuationToken != "");
                return blobs;
            }
            catch (RequestFailedException e)
            {
                Console.WriteLine(e.Message);
                Console.ReadLine();
                throw;
            }
            
        }
  1. Копировать и удалить
private static async Task CopyAndDeltet(BlobItem item, BlobContainerClient des, BlobContainerClient source, string newFolder, string sasToken) {

            try
            {
                var sourceBlobUrl = source.GetBlobClient(item.Name).Uri.ToString() + "?" + sasToken;
                var desblobName = newFolder + item.Name.Substring(item.Name.IndexOf("/"));
                var operation = await des.GetBlobClient(desblobName).StartCopyFromUriAsync(new Uri(sourceBlobUrl)).ConfigureAwait(false);
                var response = await operation.WaitForCompletionAsync().ConfigureAwait(false);
                if (response.GetRawResponse().Status == 200)
                {
                    await source.GetBlobClient(item.Name).DeleteAsync().ConfigureAwait(false);
                }
            }
            catch (Exception)
            {

                throw;
            }
        }
        private static string generateSAS(StorageSharedKeyCredential cred, string containerName, string blobName) {
            var sasBuilder = new BlobSasBuilder()
            {
                BlobContainerName = containerName,
                BlobName = blobName,
                StartsOn = DateTime.UtcNow.AddMinutes(-2),
                ExpiresOn = DateTime.UtcNow.AddHours(1)
            };
            sasBuilder.SetPermissions(BlobSasPermissions.Read);
            return sasBuilder.ToSasQueryParameters(cred).ToString();
        }

Подробнее см. здесь , здесь и здесь

Кроме того, обратите внимание, что если вы хотите скопировать большое количество больших двоичных объектов или больших двоичных объектов, функция Azure не является хорошим выбором. Функцию Azure можно использовать только для выполнения некоторых краткосрочных задач. Я предлагаю вам использовать фабрику данных Azure или Azcopy.

person Jim Xu    schedule 17.09.2020
comment
Если это полезно для вас, не могли бы вы принять это как ответ? - person Jim Xu; 17.09.2020
comment
У меня есть несколько больших двоичных объектов для копирования в папку назначения и удаления исходных больших двоичных объектов. - person karthik kasula; 17.09.2020
comment
Нужен ли мне sas для копирования и удаления файлов в том же контейнере? - person karthik kasula; 17.09.2020
comment
@karthikkasula Если это так, вы не можете создавать токен sas. - person Jim Xu; 17.09.2020
comment
Как скопировать файлы из исходной папки в целевую и удалить исходные файлы без Sas. Я использую один и тот же контейнер для источника и места назначения. Можете ли вы поделиться некоторыми примерами? - person karthik kasula; 17.09.2020
comment
@karthikkasula, попробуйте обновить код как var sourceBlobUrl = source.GetBlobClient(item.Name).Uri.ToString() : docs.microsoft.com/en-us/dotnet/api/ - person Jim Xu; 17.09.2020
comment
@karthikkasula У тебя есть другие проблемы? - person Jim Xu; 19.09.2020