Azure Blob存储-当我保存到文件时为404

时间:2019-05-14 19:51:42

标签: azure azure-storage azure-storage-blobs

Azure Blob存储还有另一个问题,这次是下载。我得到的文件列表没有问题,但是不幸的是,当我要下载它时,出现了404错误,找不到该文件。

using System.IO;
using System.Linq;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

namespace BlobStorage
{
    class Program
    {
        static void Main(string[] args)
        {
            CloudStorageAccount backupStorageAccount = CloudStorageAccount.Parse(
                "{connectionString}");

            var backupBlobClient = backupStorageAccount.CreateCloudBlobClient();
            var backupContainer = backupBlobClient.GetContainerReference("{container-name");

            var list = backupContainer.ListBlobs(useFlatBlobListing: true);

            foreach (var blob in list)
            {
                var blobFileName = blob.Uri.Segments.Last();
                CloudBlockBlob blockBlob = backupContainer.GetBlockBlobReference(blobFileName);

                string destinationPath = string.Format(@"D:\" + blobFileName +".txt");

                blockBlob.DownloadToFile(destinationPath, FileMode.OpenOrCreate);
            }
        }
    }
}

错误消息:

  

Microsoft.WindowsAzure.Storage.StorageException:“远程服务器   返回错误:(404)找不到。”

     

内部异常WebException:远程服务器返回错误:   (404)找不到。

并指向该行:

blockBlob.DownloadToFile (destinationPath, FileMode.OpenOrCreate);

这样的文件大多数存在于Blob存储中。当我输入Blob版本时,将url复制到文件中,我可以通过浏览器下载它而没有任何问题。不幸的是,由于404错误,我无法从应用程序级别下载它。

只有这样的文件为什么存在?

1 个答案:

答案 0 :(得分:1)

问题在于如何在下面的代码行中获得Blob名称:

var blobFileName = blob.Uri.Segments.Last();

考虑,路径为tempdata/ExampleIotHub/02/2019/05/14/39,blob的名称为ExampleIotHub/02/2019/05/14/39(假设您的容器名称为tempdata),但是您得到的blobFileName仅为39(请参见示例{ {3}})。由于名称39上没有斑点,因此出现此404错误。

我建议您尝试执行以下操作:

foreach (var blob in list)
{
    var localFileName = blob.Uri.Segments.Last();
    CloudBlockBlob blockBlob = blob as CloudBlockBlob;
    if (blockBlob != null)
    {
      string destinationPath = string.Format(@"D:\" + localFileName +".txt");

      blockBlob.DownloadToFile(destinationPath, FileMode.OpenOrCreate);
    }
}

请注意,我没有尝试运行此代码,因此可能会出现一些错误。