Невозможно сослаться на блочные объекты с пустым пространством в имени файла - PullRequest
0 голосов
/ 05 января 2019

Я использую Azure SDK для .Net (версия 9.3.1, платформа .NET-Standard 2.0) для работы с хранилищем BLOB-объектов Azure, и у меня возникают проблемы с обращением к блочным блобам, имеющим пустое пространство в имени блоба. Я загрузил блочный BLOB-объект JSON Test.json в личный контейнер через Azure Storage Explorer 1.6.1.

Свойства BLOB-объектов в соответствии с Azure Storage Explorer:

Name: `JSON Test.json`
URI: `https://<myaccountname>/<mycontainername>/JSON%20Test.json`

Теперь я пытаюсь проверить, существует ли этот BLOB-объект с помощью метода CloudBlock​Blob.​Exists​Async(), передаваемого в GetBlockBlobReference некодированное имя файла JSON Test.json

И получить ЛОЖЬ в результате.

Теперь я создаю большой двоичный объект программно в другом контейнере, передавая то же имя файла без кодировки, используя тот же GetBlockBlobReference и получая созданный большой двоичный объект с закодированным именем файла.

Name: `JSON%20Test.json` 
URI: `https://<myaccountname>/<mycontainername2>/JSON%20Test.json`

Что я делаю не так? Почему мой блочный блоб с пустым пространством в имени, созданный с помощью обозревателя хранилищ Azure, не найден при обращении к нему с некодированным именем файла? Почему при создании блочного блога программно передается незашифрованное имя файла, почему имя файла кодируется через провод?

Пожалуйста, помогите.

Заранее большое спасибо!

public async Task<bool> CheckExistsAsync(string connectionString, string containerName, string fileName)
        {
            var blockBlob = GetBlockBlobReference(connectionString, containerName, fileName);
            return await blockBlob.ExistsAsync();
        }

private static CloudBlockBlob GetBlockBlobReference(string connectionString, string containerName, string fileName)
        {
            return CloudStorageAccount
                .Parse(connectionString)
                .CreateCloudBlobClient()
                .GetContainerReference(containerName)
                .GetBlockBlobReference(fileName);
        }

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Пожалуйста, попробуйте обновить WindowsAzure.Storage до последней версии v9.3.3.

Я использовал ваш код для тестирования, и никаких проблем с именем BLOB-объекта не было.

Пример кода:

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.Threading.Tasks;

namespace AzureBlobConsole
{
    class Program
    {
        static void Main(string[] args)
        {         
            string conn = "xxxx";
            bool x = CheckExistsAsync(conn, "f11", "222 json test.json").GetAwaiter().GetResult();

            //to see if the file exists or not
            Console.WriteLine(x);
            Console.WriteLine("completed.");
            Console.ReadLine();
        }

        public static async Task<bool> CheckExistsAsync(string connectionString, string containerName, string fileName)
        {
            var blockBlob = GetBlockBlobReference(connectionString, containerName, fileName);
            return await blockBlob.ExistsAsync();
        }

        private static CloudBlockBlob GetBlockBlobReference(string connectionString, string containerName, string fileName)
        {
            return CloudStorageAccount
                .Parse(connectionString)
                .CreateCloudBlobClient()
                .GetContainerReference(containerName)
                .GetBlockBlobReference(fileName);
        }

    }
}

Результат теста:

enter image description here

0 голосов
/ 05 января 2019

Чтобы проверить, существует ли BLOB-объект, попробуйте следующий код:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

var found = await blobClient.GetBlobReferenceFromServerAsync(new Uri(filename));

Возможно, вам нужен доступ к файлу через Uri, а не по строке в вашей последней строке. Я действительно не использовал асинхронные методы, которые вы использовали, но приведенный выше код работает для меня.

...