无法引用文件名中带有空格的块Blob

时间:2019-01-05 09:56:51

标签: c# azure-storage-blobs azure-sdk-.net

我正在使用用于.Net(版本9.3.1,平台.NET-Standard 2.0版)的Azure SDK来处理Azure Blob存储,并且在引用块名称中具有空格的块Blob时遇到麻烦。 我已通过Azure Storage Explorer 1.6.1将块blob JSON Test.json上传到私有容器中。

Azure存储资源管理器的Blob属性:

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

现在,我正在尝试通过将CloudBlock​Blob.​Exists​Async()方法传递给GetBlockBlobReference未编码的文件名JSON Test.json

来检查Blob是否存在

并得到FALSE作为结果。

现在,我正在以编程方式在不同的容器中创建blob,使用相同的GetBlockBlobReference传递未编码的相同文件名,并创建了具有编码文件名的blob。

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

我做错了什么?为什么在使用非编码文件名引用它的过程中,找不到通过Azure Storage Explorer创建的名称为空格的块Blob?当以编程方式创建一个块Blob时,传递的是未编码的文件名,为什么文件名是通过电线编码的?

请帮助。

非常感谢!

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 :(得分:0)

要检查blob是否存在,请尝试以下代码:

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

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

您可能需要通过Uri而不是最后一行中的字符串来访问文件。我还没有真正使用过您使用的异步方法,但是上面的代码是对我有用的代码。

答案 1 :(得分:0)

请尝试将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